當前位置:首頁 » 操作系統 » 資料庫的事務機制

資料庫的事務機制

發布時間: 2022-11-30 05:56:17

『壹』 請詳細解釋一下SQL中事務的定義以及實例。

事務是一種機制,是一個操作序列。事務包含了一組資料庫操作命令,所有的命令作為一個整體一起向系統提交或撤銷,這些命令要麼都執行要麼都不執行,因此事務是一個不可分割的邏輯工作單元。一個事務可能包括一條Transact-SQL語句,也可能包括多條Transact-SQL語句。
實例:設計一個簡單的事務。
USE 學生成績管理
GO
BEGIN TRAN -----開始一個事務
UPDATE 課程表 SET 學分=學分+1
DELETE FROM 成績表 WHERE 成績<60
COMMIT TRAN ------結束一個事務
GO

『貳』 SQL的存儲過程和事務是怎麼回事

存儲過程就相當於編程語言中的函數或方法,根據用戶給定的參數執行一段代碼
例:你給我20分,我從鍵盤輸入文字,回答問題,並提交答案.我所做的就是一個存儲過程,你給的20分是參數,你給的分多,我就回答的詳細
事務是一種機制,確保一組資料庫命令,要麼全都執行,要麼都不執行
例:你到銀行轉帳1000元到我的賬戶里,當錢剛從你的賬戶里取出來(還沒來的及轉入我的賬戶),突然斷電了,這時你的賬戶就莫名其妙的損失了1000元,事務就是為了避免這種情況,只有當你的賬戶減少1000,並且我的賬戶存入1000之後,這個轉帳才算成功,所以就要將"存款"和"取款"寫到一個事務中去

『叄』 資料庫詳解之事務

究竟什麼是資料庫的事務,為什麼資料庫需要支持事務,為了實現資料庫事務各種資料庫的是如何設計的。還是只談理解,歡迎大家來討論。

1. 資料庫事務是什麼

事務的定義,已經有太多文章寫過,我就不重復了。我理解的事務就是用來保證數據操作符合業務邏輯要求而實現的一系列功能。換句話說,如果資料庫不支持事務,上面業務系統的程序員就需要自己寫代碼保證相關數據處理邏輯的正確性。而資料庫事務就是把一系列保證資料庫處理邏輯正確性的通用功能在資料庫內實現,並且盡量提高效率。

舉個例子,資料庫最開始普及就是在金融業,銀行的存取款場景就是一個最典型的OLTP資料庫場景,而事務就是設計用來保證類似場景的業務邏輯正確性的。

![事務的四個基本特性](https://img-blog.csdnimg.cn/.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2luZHRhbGtlcnd5,size_20,color_FFFFFF,t_70,g_se,x_16)

**原子性**,如果你要給家人轉賬,必須在你的賬戶里扣掉100塊,在家人賬戶里加上100塊,這兩筆操作需要一起完成,業務邏輯才是正確的。但是程序在做修改的時,肯定會有先後順序,試想一下程序扣了你的錢,這個時候程序崩潰了,家人賬戶的錢沒有加上。那這100塊是不是消失了?你是不是要發瘋?那麼,就把這兩筆操作放進一個事務里,通過原子性保證,這兩筆操作要麼都成功,要麼都失敗。這樣才能保證業務邏輯的正確性。

**一致性**,有很多文章講過一致性,但是很多人會把一致性跟原子性混在一起說。事務的一致性指的是指每一個事務必須保證執行之後所有庫內的規則依舊成立。比如內外鍵,constraint,觸發器等。舉例來說,你在儲蓄卡里有100元,理財賬戶里有100元,基金賬戶有100元,那麼你在資產總和里會看到300元,這個300元必須是其他三個賬戶余額加在一起得到的。你在給家人轉帳100元是從儲蓄卡里轉出去了100元,那麼在資料庫上可以通過創建觸發器的方式,當儲蓄卡余額賬戶減100元的同時,把資產總和也同步減去100,不然的話,就會出現邏輯上的錯誤,因為你已經轉走了100塊儲蓄卡余額,實際資產總和應該是200,如果還是300,資料庫狀態就不一致了。所以實現事務的時候,必須要保證相關聯的觸發器以及其他所有的內部規則都執行成功,事務才能算執行成功。如果在減去資產總時出錯,那麼這筆轉帳交易也不能成功。因為這樣資料庫就會進入不一致的狀態。

那麼這里跟原子性的區別到底在哪裡呢?原子性是指個多個用戶指令之間必須作為一個整體完成或失敗,而一致性更多是資料庫內的相關數據規則必須同時完成或失敗。

**持久性**,最容易理解的一個,事務只要提交了,那麼對資料庫的修改就會保存下來不會丟了。簡單來說,只要提交了,資料庫就算崩潰了,重啟之後你剛存的100塊依然在你的賬戶里。

**隔離性**,每個事務相對於其他的事務是有一定獨立性的,不能互相影響。因為資料庫需要支持並發的操作來提高效率。在並發操作時,一定要通過操作之間的隔離來保證業務邏輯的正確性。比如,你轉帳100塊給家人,一系列操作的最後一步可能是輸入驗證碼,這個時候轉帳還沒有完成,但是在資料庫里你的賬戶對應的記錄中已經減去100塊,家人賬戶也加了100塊,就等著驗證碼輸入以後,事務提交,完成操作。那麼,這個時候,家人通過手機銀行能夠查到這100塊么?你的答案可能是不能,因為這樣才符合業務邏輯,因為你的轉帳操作還沒有提交,事務還沒有完成。那麼資料庫就應該保證這兩個並發操作之間具有一定的隔離性。

那麼到底應該隔離到什麼程度呢?隔離性又分為4個等級:由低到高依次為Read uncommitted(讀未提交)、Read committed(讀提交)、Repeatable read(可重復讀取)、Serializable(序列化),這四個級別可以逐個解決臟讀、不可重復讀、幻象讀這幾類問題。這些東西是什麼意思?請有興趣的小夥伴自行網路,很多文章都寫的很清楚。

那麼怎麼理解不同的隔離等級呢,首先要理解並發操作,並發操作就是指有不同的用戶同時對一個數據進行讀、寫操作,那麼在這個過程中,每個用戶應該看到什麼數據才能保證業務邏輯的正確性呢? 如果是前面存取款的場景,我必須看到的是已經存進來的錢,也就是必須是已經提交的事務。而12306刷火車票呢,你可以看到有10張余票,但是在下單的時候告訴你票賣完了,因為同時有10個用戶把票買掉了,你需要重新刷余票,這個也是可以接受的,也就是說我可以讀到一些虛假的余票,這樣在業務上也沒有什麼問題。那麼在設計這兩個不同系統時,就可以選擇不同的事務隔離級別來實現不同的並發效果。不同的隔離等級就是要在系統的並發性和數據邏輯的嚴謹性之間做出的平衡。

2. 資料庫如何實現事務

資料庫實現事務會有多種不同的方式,但基本的原理類似,比如都需要對事務進行統一的編號處理,都需要記錄事務的狀態(是成功了還是失敗了),都需要在數據存儲的層面對事務進行支持,以明確哪些數據是被哪些事務、插入、修改和刪除的。同時還會記錄事務日誌等,對事務進行系統化的管理以實現數據的原子性,一致性和持久性。

要實現事務的隔離性,最基礎的就是通過加鎖機制把並發操作適當的串列化來保證數據操作的正確邏輯。但是為了要保證系統具有良好的並發性能,必須要在實現事務隔離性時需要找到合理的平衡點。大部分資料庫(包括Oracle,MySQL,Postgres在內)在做並發控制的時候都會採用MVCC(多版本並發控制)的機制來保證系統具有較高的並發性,不同資料庫實現MVCC的具體方案也不盡相同,但其基本原理類似。

3. MVCC實現原理

所謂MVCC,就是資料庫中的同一查詢根據相關事務執行的先後順序以及隔離級別的不同,可能會存在不同版本的結果,通過這樣的手段來保證大部分查詢操作不會被修改操作阻塞並保證數據邏輯的正確性。也就是資料庫通過保存多個版本的數據( 歷史 數據)來提高系統的並發查詢能力。簡單來說就是用存儲空間來交換並發能力。下面以Postgres為例介紹一下MVCC的一種實現方式幫助大家理解這個重要的資料庫概念。通過下面的圖來解釋Posrgres里最基本的數據可見性是如何實現多版本控制的。

![在這里插入圖片描述](https://img-blog.csdnimg.cn/.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2luZHRhbGtlcnd5,size_20,color_FFFFFF,t_70,g_se,x_16)

首先,Postgres里的每一個事務都有編號,這里可以簡單理解為時間順序編號,編號越大的事務發生越晚。然後,資料庫里的每一行記錄都會保存創建這條記錄的事務號(Cre),也會在記錄刪除時保存刪除這條記錄的事務號(Exp),換句話說,只要Exp這里一列里記錄了事務編號,就說明這條記錄被刪除了。那麼一個事務應該能看見那些記錄呢?Postgres里每一個事務都會保存一個當前系統的事務快照(Snapshot),這個快照里會保存事務創建時當前系統的最高(最晚)事務編號,以及目前還在進行中的事務編號。那麼如上圖所示的一個事務的快照里最高事務編號為100,目前正在進行的事務有25,50和75。那麼對應左邊數據記錄,這6行數據的可見性就如同標注的一般:

第一行,Cre 30,沒有刪除,在100這個時間點,應該能看到。

第二行,Cre 50,沒有刪除,但是50這個事務還沒有提交,正在進行中,所以看不見。

第三行,Cre 110,沒有刪除,但是100這個時間點110事務還沒有發生,所以看不見。

第四行,Cre 30,Exp 80,在80的時候數據被刪掉了,所以看不見。

第五行,Cre 30,Exp 75,在30的時候被創建,75時候被刪掉了,但是75這個事務在100的時候還沒有提交,所以這條記錄在100的時候還沒有刪掉,所以看得見。

第六行,Cre30,Exp 110,在30的時被創建,110時候被刪掉,但是在100時候,110還沒有發生,所以看得見。

綜上,就是這個事務對這六條記錄的可見性,也就是一個數據版本。那麼大家可以看一下如果另一個事務的快照里存的是最高事務編號為110,正在進行的事務為50,那麼它能看到的數據應該是哪幾行呢?同時大家也看到,Postgres里刪除一行數據其實就是在這一行的Exp這個列記錄一個刪除事務的編號,相當於做了一個刪除標記,而數據沒有真正被刪除,因此Postgres資料庫需要定期做數據清理操作(Vacuum)。Pstgres的在現實場景里會比這里介紹的要復雜,因為我們這里假定所有的事務最終都是正確提交了,如果存在某些事務沒有提交的情況,那麼可見性就會更加復雜,這里不再展開了。

資料庫事務是基本的資料庫概念,之前已經有很多很好文章做過介紹,這里希望能把自己的理解用比較通俗的描述分享給大家,歡迎來討論交流。

『肆』 什麼是資料庫事務

資料庫事務,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。

一個邏輯工作單元要成為事務,必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。事務是資料庫運行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。

企業級的資料庫管理系統(DBMS)都有責任提供一種保證事務的物理完整性的機制。就常用的SQL Server2000系統而言,它具備鎖定設備隔離事務、記錄設備保證事務持久性等機制。因此,我們不必關心資料庫事務的物理完整性,而應該關注在什麼情況下使用資料庫事務、事務對性能的影響,如何使用事務等等。

拓展資料:

事務有三種模型:

1、隱式事務是指每一條數據操作語句都自動地成為一個事務,事務的開始是隱式的,事務的結束有明確的標記。

2、顯式事務是指有顯式的開始和結束標記的事務,每個事務都有顯式的開始和結束標記。

3、自動事務是系統自動默認的,開始和結束不用標記。

熱點內容
sql日期第幾周 發布:2023-02-01 04:55:19 瀏覽:912
忻州飛貓網吧電腦什麼配置 發布:2023-02-01 04:53:52 瀏覽:325
蘋果導入安卓數據用什麼最快 發布:2023-02-01 04:51:52 瀏覽:282
手機里的安卓視頻怎麼下載 發布:2023-02-01 04:51:52 瀏覽:607
linux安裝c語言 發布:2023-02-01 04:51:38 瀏覽:256
資料庫實體定義 發布:2023-02-01 04:47:51 瀏覽:226
文件夾翻譯成英文 發布:2023-02-01 04:46:35 瀏覽:192
怎麼上傳壓縮文件 發布:2023-02-01 04:37:33 瀏覽:530
sql資料庫只讀 發布:2023-02-01 04:37:18 瀏覽:380
哪些車配置可以自己裝 發布:2023-02-01 04:35:04 瀏覽:122