通俗易懂的MySQL事務隔離

更多知識,請移步我的小破站:http://hellofriend.top

事務(Transaction)是由一系列對系統中數據進行訪問與更新的操作所組成的一個程序執行邏輯單元。 僅從其定義來看,你可能難以理解什麼是事物,接下來我們舉個經典例子來說明事務的用途:

用戶A向用戶B轉賬,我們需要進行以下操作:從A賬戶中把餘額讀出來;對A賬戶做減法操作;把結果寫回A賬戶中;從B賬戶中把餘額讀出來;對B賬戶做加法操作;把結果寫回B賬戶中。

在以上這些操作中需要保證所有操作是一個整體,即:要麼都成功,要麼都不成功。 爲了解決這種問題,我們引入了事務

ACID特性

數據庫事務擁有以下4大特性: 原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。

1. 原子性

原子性是指事務是一個不可再分割的工作單元,事務中的操作要麼都發生,要麼都不發生。

簡單來說就是操作成功了就成功了,一旦操作失敗了就會放棄事務中已經執行的操作,回到事務剛開始的狀態。

2. 一致性

一致性是指在事務開始之前和事務結束以後,數據庫的完整性約束沒有被破壞。這是說數據庫事務不能破壞關係數據的完整性以及業務邏輯上的一致性。

一致性就是說不管操作是否成功,總的數據不會發生改變。例如,A向B轉賬,A和B的總金額不發生變化。

3. 隔離性

多個事務併發訪問時,事務之間是隔離的,一個事務不應該影響其它事務運行效果。

例如,A在轉賬1億給B(事務1),同時C又在轉賬3億給A(事務2),不管事務1和事務2誰先執行完畢,最終結果必須是A賬戶增加2億(而不是3億),B增加1億,C減少3億。

事務最複雜問題都是由事務隔離性引起的。完全的隔離性是不現實的,完全的隔離性(序列化)要求數據庫同一時間只執行一條事務,而這將會嚴重影響性能。

4. 持久性

持久性,意味着在事務完成以後,該事務對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。也就是說,完成的事務是系統永久的部分,對系統的影響是永久性的,該影響即使出現致命的系統故障也將會一直保持。

事務併發造成的問題

更新丟失:當事務1更新失敗時會回滾數據,而在回滾之前事務2若成功更新數據,則事務2更新成功後的數據會被回滾覆蓋,造成更新丟失。

髒讀:當事務1讀取了事務2未提交的數據,而事務2執行失敗進行回滾,則事務1讀取到是數據就是無中生有的數據,即髒數據。

不可重複讀:事務1讀取某個數據後,事務2對其做了修改,當事務1再次讀該數據時得到與前一次不同的值。

幻讀:事務1讀取在讀取某範圍數據時,事務2插入一條數據,當事務1再次讀取這個範圍數據時就不一樣了,出現了一些幻數據。
例如:A先把所有人的餘額清零,同時,B往表中插入了一條餘額爲100的數據。A提交以後,發現竟然還有100的數據,即發生幻讀。

隔離性和隔離級別

隔離性

隔離性是通過鎖實現的,當一個事務對某項數據進行更新操作的時候就會對數據加鎖,從而防止其他事務對該數據的影響,鎖的級別一般有3種,全局鎖,表鎖,行鎖,MySQL中的InnoDB支持以上的三種鎖,MyISAM不支持行鎖。鎖獲取的時機是事務執行的第一句纔開始鎖住數據的,並不是在數據開啓的時候獲取的,當事務提交成功後纔會釋放鎖。

隔離級別

隔離級別有4種從低到高分別是讀未提交(Read uncommitted)、讀提交(Read committed)、重複讀(Repeatable read)、序列化(Serializable)。

讀未提交(Read uncommitted)

從名稱中就可以看出,讀未提交,即一個事務可以讀另一個事務未提交的數據,簡單來說就是一個事務修改了某個數據,當它還沒提交的時候,另一個事務讀取該數據的時候,會讀取到修改後的數據,即使修改的事務還沒有提交。這種隔離級別解決了更新丟失,當一個事務寫時其他事務可讀不可寫

讀提交(Read committed)

從名稱也可以看出來,讀提交,一個事務要等另一個事務提交後才能讀取數據,即事務期間獨佔數據,其他數據不能對該數據進行讀寫操作。這種級別解決了髒讀和更新丟失,當一個事務寫時其他事務不可讀寫

重複讀(Repeatable read)

重複讀,即一個事務重複讀的數據是相同的,就是當一個事務對數據進行讀操作的時候,其他事務不能對其進行修改但可讀。這種隔離級別解決了髒讀,更新丟失和不可重複讀,一事務讀時其他事務可讀不可寫

序列化(Serializable)

這是最高的隔離級別,所有的事務只能一個接一個的執行,可以避免髒讀、不可重複讀與幻讀。但這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。

下面總結一下各種隔離級別可避免的問題:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章