鎖的類型:
基本的封鎖類型有兩種:排它鎖(X鎖)和共享鎖(S鎖)
X鎖,是事務(wù)T對(duì)數(shù)據(jù)A加上X鎖時(shí),只允許事務(wù)T讀取和修改數(shù)據(jù)A
S鎖,是事務(wù)T對(duì)數(shù)據(jù)A加上S鎖時(shí),其他事務(wù)只能再對(duì)數(shù)據(jù)A加S鎖,而不能加X(jué)鎖,直到T釋放A上的S鎖。
若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加了S鎖,則T就可以對(duì)A進(jìn)行讀取,但不能進(jìn)行更新(S鎖因此又稱為讀鎖)。在T釋放A上的S鎖以前,其他事務(wù)可以再對(duì)A加S鎖,但不能加X(jué)鎖,從而可以讀取A,但不能更新A。
更多鎖的類型和隔離級(jí)別參考SQL 隔離級(jí)別
五類并發(fā)問(wèn)題
丟失更新(一類丟失更新)
撤銷一個(gè)事務(wù)時(shí),把其他事務(wù)已提交的更新數(shù)據(jù)覆蓋
A和B事務(wù)并發(fā)執(zhí)行,A事務(wù)執(zhí)行更新后,提交;B事務(wù)在A事務(wù)更新后,B事務(wù)結(jié)束前也做了對(duì)該行數(shù)據(jù)的更新操作,然后回滾,則兩次更新操作都丟失了。
臟讀
一個(gè)事務(wù)讀到另一個(gè)事務(wù)未提交的更新數(shù)據(jù)
A和B事務(wù)并發(fā)執(zhí)行,B事務(wù)執(zhí)行更新后,A事務(wù)查詢B事務(wù)沒(méi)有提交的數(shù)據(jù),B事務(wù)回滾,則A事務(wù)得到的數(shù)據(jù)不是數(shù)據(jù)庫(kù)中的真實(shí)數(shù)據(jù)。也就是臟數(shù)據(jù),即和數(shù)據(jù)庫(kù)中不一致的數(shù)據(jù)。
不可重復(fù)讀
一個(gè)事務(wù)讀到另一個(gè)事務(wù)已提交的更新數(shù)據(jù)
A和B事務(wù)并發(fā)執(zhí)行,A事務(wù)查詢數(shù)據(jù),然后B事務(wù)更新該數(shù)據(jù),A再次查詢?cè)摂?shù)據(jù)時(shí),發(fā)現(xiàn)該數(shù)據(jù)變化了。
覆蓋更新(二類丟失更新)
這是不可重復(fù)讀中的特例,一個(gè)事務(wù)覆蓋另一個(gè)事務(wù)已提交的更新數(shù)據(jù)
即A事務(wù)更新數(shù)據(jù),然后B事務(wù)更新該數(shù)據(jù),A事務(wù)查詢發(fā)現(xiàn)自己更新的數(shù)據(jù)變了。
虛讀(幻讀)
一個(gè)事務(wù)讀到另一個(gè)事務(wù)已提交的新插入的數(shù)據(jù)
A和B事務(wù)并發(fā)執(zhí)行,A事務(wù)查詢數(shù)據(jù),B事務(wù)插入或者刪除數(shù)據(jù),A事務(wù)再次查詢發(fā)現(xiàn)結(jié)果集中有以前沒(méi)有的數(shù)據(jù)或者以前有的數(shù)據(jù)消失了。
三級(jí)封鎖協(xié)議:
在運(yùn)用X鎖和S鎖對(duì)數(shù)據(jù)對(duì)象加鎖時(shí),還需要約定一些規(guī)則。例如何時(shí)申請(qǐng)X鎖或S鎖、持鎖時(shí)間、何時(shí)釋放等。稱這些規(guī)則為封鎖協(xié)議(Locking Protocol)
一級(jí)封鎖協(xié)議(對(duì)應(yīng)read uncommited)
事務(wù)T在修改數(shù)據(jù)R之前必須先對(duì)其加X(jué)鎖,直到事務(wù)結(jié)束才釋放,事務(wù)結(jié)束包括正常結(jié)束(COMMIT)和非正常結(jié)束(ROLLBACK)。
一級(jí)封鎖協(xié)議可以防止丟失修改,并保證事務(wù)T是可恢復(fù)的。使用一級(jí)封鎖協(xié)議可以解決丟失修改問(wèn)題。
在一級(jí)封鎖協(xié)議中,如果僅僅是讀數(shù)據(jù)不對(duì)其進(jìn)行修改,是不需要加鎖的,它不能保證可重復(fù)讀和不讀“臟”數(shù)據(jù)。
二級(jí)封鎖協(xié)議(對(duì)應(yīng)read commited)
在一級(jí)封鎖協(xié)議之上,事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,讀完后方可釋放S鎖。
二級(jí)封鎖協(xié)議除防止了丟失修改,還可以進(jìn)一步防止讀“臟”數(shù)據(jù)。
但在二級(jí)封鎖協(xié)議中,由于讀完數(shù)據(jù)后即可釋放S鎖,所以它不能保證可重復(fù)讀。
三級(jí)封鎖協(xié)議(對(duì)應(yīng)reapetable read)
在一級(jí)封鎖協(xié)議之上,事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,直到事務(wù)結(jié)束才釋放S鎖。
三級(jí)封鎖協(xié)議除防止了丟失修改和不讀“臟”數(shù)據(jù)外,還進(jìn)一步防止了不可重復(fù)讀。
四級(jí)封鎖協(xié)議(對(duì)應(yīng)serialization)
四級(jí)封鎖協(xié)議是對(duì)三級(jí)封鎖協(xié)議的增強(qiáng),其實(shí)現(xiàn)機(jī)制也最為簡(jiǎn)單,直接對(duì)事務(wù)中所讀取或者更改的數(shù)據(jù)所在的表加表鎖,也就是說(shuō),其他事務(wù)不能讀寫(xiě)該表中的任何數(shù)據(jù)。這樣五類并發(fā)問(wèn)題都得以避免!