事務的基本要素 事務的隔離級別

2021-09-10 19:59:18 字數 2542 閱讀 4307

事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務管理對於企業級應用而言至關重要,它保證了使用者的每一次操作都是可靠的,即便出現了異常的訪問情況,也不至於破壞後台資料的完整性。就像銀行的自動提款機atm,通常atm都可以正常為客戶服務,但是也難免遇到操作過程中及其突然出故障的情況,此時,事務就必須確保出故障前對賬戶的操作不生效,就像使用者剛才完全沒有使用過atm機一樣,以保證使用者和銀行的利益都不受損失。

acid是原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)的縮寫。

原子性:即不可分割,事務要麼全部被執行,要麼全部不執行。如果事務的所有子事務全部提交成功,則所有的資料庫操作被提交,資料庫狀態發生變化;如果有子事務失敗,則其他子事務的資料庫操作被回滾,即資料庫回到事務執行前的狀態,不會發生狀態轉換

一致性:事務的執行使得資料庫從一種正確狀態轉換成另外一種正確狀態

隔離性:在事務正確提交之前,不允許把事務對該資料的改變提供給任何其他事務,即在事務正確提交之前,它可能的結果不應該顯示給其他事務

永續性:事務正確提交之後,其結果將永遠儲存在資料庫之中,即使在事務提交之後有了其他故障,事務的處理結果也會得到儲存

髒讀:是指事務a讀到了事務b還沒有提交的資料,比如銀行取錢,事務a開啟事務,此時切換到事務b,事務b開啟事務-->取走100元,此時切換回事務a,事務a讀取的肯定是資料庫裡面的原始資料,因為事務b取走了100塊錢,並沒有提交,資料庫裡面的賬務餘額肯定還是原始餘額,這就是髒讀。

不可重複讀:是指在乙個事務裡面讀取了兩次某個資料,讀出來的資料不一致。還是以銀行取錢為例,事務a開啟事務-->查出銀行卡餘額為1000元,此時切換到事務b事務b開啟事務-->事務b取走100元-->提交,資料庫裡面餘額變為900元,此時切換回事務a,事務a再查一次查出賬戶餘額為900元,這樣對事務a而言,在同乙個事務內兩次讀取賬戶餘額資料不一致,這就是不可重複讀。

幻讀:是指在乙個事務裡面的操作中發現了未被操作的資料。比如學生資訊,事務a開啟事務-->修改所有學生當天簽到狀況為false,此時切換到事務b,事務b開啟事務-->事務b插入了一條學生資料,此時切換回事務a,事務a提交的時候發現了一條自己沒有修改過的資料,這就是幻讀,就好像發生了幻覺一樣。幻讀出現的前提是併發的事務中有事務發生了插入、刪除操作。

注意:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

注意:事務隔離級別越高,在併發下會產生的問題就越少,但同時付出的效能消耗也將越大,因此很多時候必須在併發性和效能之間做乙個權衡。不是事務隔離級別設定得越高越好,事務隔離級別設定得越高,勢必要花手段去加鎖用以保證事務的正確性,這樣效率就會有所降低,在實際開發中要在效率和併發正確性之間做乙個取捨。一般情況下會設定為read commited,此時避免了髒讀,併發性也還不錯,再通過一些別的手段去解決不可重複讀和幻讀的問題就好了。

default(預設隔離級別):每種資料庫支援的事務隔離級別不一樣,如果spring配置事務時將isolation設定為這個值的話,那麼將使用底層資料庫的預設事務隔離級別。順便說一句,如果使用的mysql,可以使用"select @@tx_isolation"來檢視預設的事務隔離級別。

read uncommitted(未提交讀):即能夠讀取到沒有被提交的資料,所以很明顯這個級別的隔離機制無法解決髒讀、不可重複讀、幻讀中的任何一種,因此很少使用。

read commited(提交讀):即能夠讀到那些已經提交的資料,自然能夠防止髒讀,但是無法限制不可重複讀和幻讀。

repeatable read(可重複讀):即在資料讀出來之後加鎖,類似"select * from *** for update",明確資料讀取出來就是為了更新用的,所以要加一把鎖,防止別人修改它。repeatable_read的意思也類似,讀取了一條資料,這個事務不結束,別的事務就不可以改這條記錄,這樣就解決了髒讀、不可重複讀的問題,但是幻讀的問題還是無法解決。

serlalizable(可序列化):最高的事務隔離級別,不管多少事務,挨個執行完乙個事務的所有子事務之後才可以執行另外乙個事務裡面的所有子事務,這樣就解決了髒讀、不可重複讀和幻讀的問題了。

事務隔離級別

髒讀不可重複讀

幻讀讀未提交(read-uncommitted)是是

是不可重複讀(read-committed)否是

是可重複讀(repeatable-read)否否

是序列化(serializable)否否

mysql事務基本要素和隔離級別

注意 只是個人理解的手記,不具備權威準確性 mysql事務基本要素和隔離級別 一.事務的四個基本要素 1.原子性 事務中的操作要麼都執行,要麼都回滾 2.一致性 a和b存款各位500,相互轉賬總額保持1000不變,對開發者有要求,不能寫出錯誤邏輯 3.隔離性 多事務併發時,保證各事務處理互不干擾,有...

事務的隔離級別舉例 事務的隔離級別

乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...

事務的隔離級別舉例 JDBC 事務隔離級別

本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...