DBMS包含一個(gè)鎖管理器矾削,用于決定事務(wù)是否可以鎖定碗殷。 它了解系統(tǒng)內(nèi)部的最新情況。
?共享鎖(S-LOCK):允許多個(gè)事務(wù)同時(shí)讀取同一對(duì)象的鎖祟霍。 如果一個(gè)事務(wù)持有共享鎖杏头,則另一個(gè)事務(wù)可以獲取該共享鎖。
?獨(dú)占鎖定(X-LOCK):允許事務(wù)修改對(duì)象沸呐。 此鎖與任何其他鎖不兼容醇王。 一次只能有一個(gè)事務(wù)持有獨(dú)占鎖。
使用鎖執(zhí)行:
1.事務(wù)從鎖管理器請(qǐng)求鎖(或升級(jí))崭添。
2.鎖管理器根據(jù)其他事務(wù)當(dāng)前持有的鎖來(lái)授予或阻止請(qǐng)求厦画。
3.當(dāng)不再需要時(shí),事務(wù)釋放鎖。
4.鎖管理器更新其內(nèi)部鎖表根暑,然后把鎖給其他等待的事務(wù)力试。
二階段鎖定
兩階段鎖定(2PL)是一種悲觀的并發(fā)控制協(xié)議,用于確定是否允許事務(wù)訪問(wèn)數(shù)據(jù)庫(kù)中的對(duì)象排嫌。協(xié)議不需要知道事務(wù)將提前執(zhí)行??的所有查詢畸裳。
階段#1:膨脹
?每個(gè)事務(wù)都從DBMS的鎖管理器請(qǐng)求它所需的鎖。
?鎖管理器授予/拒絕鎖定請(qǐng)求淳地。
階段#2:收縮
?事務(wù)在釋放第一個(gè)鎖后立即進(jìn)入此階段怖糊。
?允許事務(wù)僅釋放先前獲取的鎖。它無(wú)法在此階段獲得新鎖颇象。
就其本身而言伍伤,2PL足以保證conflict serializability。它生成precedence graph是無(wú)環(huán)的遣钳。
2個(gè)缺點(diǎn):
但它很容易出現(xiàn)級(jí)聯(lián)中止扰魂,即當(dāng)事務(wù)中止并且現(xiàn)在必須回滾另一個(gè)事務(wù)時(shí),這會(huì)導(dǎo)致浪費(fèi)很多資源蕴茴。
還有一些可序列化的潛在計(jì)劃劝评,但2PL不允許這種計(jì)劃(鎖會(huì)限制并發(fā))。
嚴(yán)格的2pl
事務(wù)只在完成時(shí)釋放鎖倦淀。 確實(shí)沒(méi)有像普通2PL那樣shrinking的階段蒋畜。
如果事務(wù)寫入的值在該事務(wù)完成之前未被其他事務(wù)讀取或覆蓋,則調(diào)度是嚴(yán)格的撞叽。
這種方法的優(yōu)點(diǎn)是DBMS不會(huì)導(dǎo)致級(jí)聯(lián)中止姻成。
同時(shí)只要把原來(lái)的值賦值回去就可以實(shí)現(xiàn)abort了。
為什么呢愿棋?
我們看一下s2pl的時(shí)序圖
再看下abort是怎么做的
先undo科展,隨后記log,然后unlock
下面要解決的就是2pl 的死鎖問(wèn)題
死鎖問(wèn)題的解決思路分為2種初斑,一種是死鎖預(yù)防,一種是死鎖檢測(cè)膨处。
死鎖檢測(cè)
DBMS 創(chuàng)建 wait-for圖:如果事務(wù)Ti等待事務(wù)Tj釋放鎖见秤,從Ti到Tj有一條邊。系統(tǒng)將定期檢查等待圖中的環(huán)真椿,然后決定如何打破它鹃答。
?當(dāng)DBMS檢測(cè)到死鎖時(shí),它將選擇“受害者”事務(wù)進(jìn)行回滾以中斷循環(huán)突硝。
?受害者事務(wù)將重新啟動(dòng)或中止测摔,具體取決于應(yīng)用程序如何調(diào)用它
?選擇受害者時(shí)需要考慮多個(gè)事務(wù)屬性。沒(méi)有一個(gè)選擇比其他選擇更好。 2PL DBMS都做不同的事情:
1.按年齡(最新或最舊的時(shí)間戳)锋八。
2.按進(jìn)度(執(zhí)行的最少/大多數(shù)查詢)浙于。
3.已鎖定的項(xiàng)目數(shù)量。
4.通過(guò)我們必須用它回滾的#個(gè)事務(wù)挟纱。
5.過(guò)去重啟事務(wù)的次數(shù)
?回滾長(zhǎng)度:選擇要中止的受害者事務(wù)后羞酗,DBMS還可以決定回滾事務(wù)的更改的距離∥煞可以是整個(gè)事務(wù)檀轨,也可以是足夠的操作(部分事務(wù))足以來(lái)打破僵局
死鎖預(yù)防
當(dāng)txn嘗試獲取另一個(gè)txn持有的鎖時(shí),DBMS會(huì)殺死其中一個(gè)以防止死鎖欺嗤。
該方法不需要wait-for圖或檢測(cè)算法参萄。
根據(jù)時(shí)間戳分配優(yōu)先級(jí)(例如,舊的意味著更高的優(yōu)先級(jí))煎饼。
這些方案保證沒(méi)有死鎖讹挎,因?yàn)樵诘却i時(shí)只允許一個(gè)方向。 當(dāng)事務(wù)重新啟動(dòng)時(shí)腺占,其(新)優(yōu)先級(jí)是其舊時(shí)間戳淤袜。
?Wait-Die(“Old等待Young”):如果T1具有更高的優(yōu)先級(jí),則T1等待T2衰伯。 否則T1中止
?wound-wait(“Young等待old”):如果T1具有更高的優(yōu)先級(jí)铡羡,則T2中止。 否則T1會(huì)等待意鲸。
關(guān)于死鎖檢測(cè) 和 死鎖預(yù)防烦周,把作業(yè)搞懂 應(yīng)該就沒(méi)啥問(wèn)題了。
https://15445.courses.cs.cmu.edu/fall2018/files/hw4-sols.pdf
粒度鎖
如果一個(gè)事務(wù)要更新十億個(gè)元組怎顾,它必須向DBMS的鎖管理器詢問(wèn)十億個(gè)鎖读慎。
這將是緩慢的,因?yàn)槲覀儽仨氃阪i管理器的內(nèi)部鎖表數(shù)據(jù)結(jié)構(gòu)中獲取鎖存器槐雾。
相反夭委,我們希望使用鎖層次結(jié)構(gòu),允許事務(wù)在系統(tǒng)中采用更粗粒度的鎖募强。 為此層次結(jié)構(gòu)中的某些內(nèi)容獲取鎖定會(huì)隱式獲取其所有子項(xiàng)的鎖定株灸。
意圖鎖定允許更高級(jí)別的節(jié)點(diǎn)以共享或獨(dú)占模式鎖定,而無(wú)需檢查所有后代節(jié)點(diǎn)擎值。 如果節(jié)點(diǎn)處于意圖模式慌烧,則在較低級(jí)別進(jìn)行顯式鎖定。
?Intention-Shared(IS):表示使用共享鎖在較低級(jí)別顯式鎖定鸠儿。
?Intention-Exclusive(IX):表示使用獨(dú)占鎖或共享鎖在較低級(jí)別顯式鎖定屹蚊。
?Shared + Intention-Exclusive(SIX):以該節(jié)點(diǎn)為根的子樹在共享模式下顯式鎖定厕氨,顯式鎖定在低級(jí)別使用獨(dú)占模式鎖定。
同樣把作業(yè)里的QUESTION 3理解清楚就搞清楚這個(gè)了汹粤。
總結(jié)
應(yīng)用程序通常不會(huì)手動(dòng)設(shè)置鎖命斧。 但有時(shí)它可以為DBMS提供一些提示來(lái)幫助它提高并發(fā)性:
SELECT ... FOR UPDATE:執(zhí)行選擇,然后在獲取的元組上設(shè)置獨(dú)占鎖
2PL幾乎用于所有DBMS玄括。 它自動(dòng)提供正確的交錯(cuò)事務(wù)操作冯丙。
但它必須能夠應(yīng)對(duì)死鎖的問(wèn)題。