面試寶典系列-MySQL的四種事務隔離級別

1、事務的基本要素

一、原子性(Atomicity):事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執行過程當中出錯,會回滾到事務開始前的狀態,全部的操做就像沒有發生同樣。也就是說事務是一個不可分割的總體,就像化學中學過的原子,是物質構成的基本單位。mysql

二、一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。好比A向B轉帳,不可能A扣了錢,B卻沒收到。sql

三、隔離性(Isolation):同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。數據庫

四、持久性(Durability):事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾。併發

2、事務在併發時出現問題

一、丟失更新spa

兩個不一樣事物同時得到相同數據,而後在各自事務中同時修改了該數據,那麼先提交的事務更新會被後提交事務的更新給覆蓋掉,這種狀況事務A的更新就被覆蓋掉了、丟失了。code

舉個栗子:對象

事務A	         事務B
讀取X=100	   讀取X=100
寫入x=X+100	   寫入x=X+200
事務結束x=200	 事務結束x=300
 	             最後x=300

二、髒讀(未提交讀) 事務

事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據ci

三、不可重複讀it

事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。

舉個栗子:

事務A	                   事務B
讀取X=100	               讀取X=100
讀取X=100	               寫入x=X+100
 	                       事務結束, x=200

讀取X=200
(此時,在同一個事務A中,
讀取的X值發生了變化!)	 
事務結束

四、幻讀

事務A讀的時候讀出了15條記錄,事務B在事務A執行的過程當中 增長 了1條,事務A再讀的時候就變成了 16 條,這種狀況就叫作幻影讀。

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

3、mysql隔離級別

是:還存在,不能避免;   否:不存在,能避免

事務隔離級別 髒讀 不可重複讀 幻讀
讀未提交(read-uncommitted)
不可重複讀(read-committed)
可重複讀(repeatable-read) 是 
串行化(serializable)

4、封鎖協議

排他鎖(X鎖):若事務T對數據對象A加上X鎖,則只容許T讀取和修改A,其餘任何事務都不能在對A加任何類型的鎖,直到T釋放A上的鎖爲止。這就保證了其餘事務在T釋放A上的鎖以前不能再讀取和修改A。

共享鎖(S鎖):若事務T對數據對象A加上S鎖,則只容許T讀A但不能修改A,其餘事務只能再對A加S鎖而不能加X鎖,知道T釋放A上的S鎖爲止。

一級封鎖協議(對應 read uncommited) :

事務T在修改數據R以前必須先對其加X鎖,直到事務結束才釋放。一級封鎖協議能夠防止丟失修改,並保證事務T是可恢復的。

二級封鎖協議(對應read commited):

在一級封鎖協議基礎上增長事務T在讀數據R以前必須先對其加S鎖,讀完後便可釋放S鎖。二級封鎖協議出防止了丟失修改,還能夠進一步防止讀「髒」數據。

三級封鎖協議(對應reapetable read ):

在一級封鎖協議的基礎上增長事務T在讀數據R以前必須先對其加S鎖,直到事務結束才釋放。三級封鎖協議出防止了丟失修改和讀「髒」數據外,還能夠進一步防止了不可重複讀。

串行化:

一二三級封鎖協議都是在行級加鎖,而串行化是對整表加鎖。讀數據時對整表加共享鎖,修改數據對整表加排他鎖。

相關文章
相關標籤/搜索