三級(jí)封鎖協(xié)議

鎖的類型:
基本的封鎖類型有兩種:排它鎖(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)題都得以避免!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 當(dāng)一個(gè)系統(tǒng)訪問(wèn)量上來(lái)的時(shí)候,不只是數(shù)據(jù)庫(kù)性能瓶頸問(wèn)題了,數(shù)據(jù)庫(kù)數(shù)據(jù)安全也會(huì)浮現(xiàn),這時(shí)候合理使用數(shù)據(jù)庫(kù)鎖機(jī)制就顯得異...
    初來(lái)的雨天閱讀 3,695評(píng)論 0 22
  • 當(dāng)一個(gè)系統(tǒng)訪問(wèn)量上來(lái)的時(shí)候,不只是數(shù)據(jù)庫(kù)性能瓶頸問(wèn)題了,數(shù)據(jù)庫(kù)數(shù)據(jù)安全也會(huì)浮現(xiàn),這時(shí)候合理使用數(shù)據(jù)庫(kù)鎖機(jī)制就顯得異...
    JackFrost_fuzhu閱讀 7,956評(píng)論 4 83
  • 讀書(shū), 品茶, 音樂(lè), 夜色, 是療傷 最好的藥劑。 那些百聽(tīng)不厭的曲兒,還是當(dāng)初你分享我的,你是否記得?
    清香百合閱讀 193評(píng)論 0 2
  • 很多事情嘗試了,堅(jiān)持了,在這過(guò)程中你會(huì)慢慢發(fā)現(xiàn),它帶給你的,遠(yuǎn)比想像中的多,比如繪畫(huà)。 有愛(ài)好真的是件很美好的事 ...
    艾米依閱讀 1,060評(píng)論 9 10
  • 東京的行程比較悠閑,不禁開(kāi)始期待著本次的重頭戲——富士山和京都的旅程。冬日的富士山讓人神往,而京都號(hào)稱為小長(zhǎng)安,所...
    遠(yuǎn)兒的園子閱讀 1,675評(píng)論 0 13

友情鏈接更多精彩內(nèi)容