您好,登錄后才能下訂單哦!
PCM鎖資源存儲方式有兩種,1.如果PCM鎖屬于本地實例,那么它會被存儲在本地實例的LE結(jié)構(gòu)中。2.如果PCM鎖屬于遠(yuǎn)程實例那么它將會被分配存儲在本地實例的共享池中。
kclle結(jié)構(gòu):
kcllerls表示release;
kcllelnm表示 name(id1,id2);
kcllemode表示 hold-mode;
kclleacq表示 acquiring;
kcllelck表示 DLM鎖。
kjbr結(jié)構(gòu):
resname_kjbr [2]表示資源名稱;
grant_q_kjbr表示grant queue;
convert_q_kjbr表示轉(zhuǎn)換隊列;
mode_role_kjbr,它表示授權(quán)模式和角色:NULL(0x00),S(0x01),X(0x02),L0本地(0x00),G0全局沒有PI(0x08),G1全局有PI(0x018)。
kjbl中的字段mode_role_kjbl是表示鎖定模式:
0x00表示為NULL模式
0x01表示為S模式
0x02表示為X;
0x04表示為master節(jié)點打開鎖;
0x08表示為全局角色;
0x10表示為存在PI;
0x20表示為CR請求;
0x40表示為S模式請求;
0x80表示為X模式請求。
示例
1.鎖定和塊請求,遠(yuǎn)程master
2.鎖定和塊請求,本地master,共享模式
3.鎖轉(zhuǎn)換,鎖降級
4.塊融合,寫/寫
5.塊融合,寫/讀(CR)
6.寫入涉及鎖定,丟棄PI
7.塊融合寫/讀,類似于步驟5
Step 1
最開始表未被緩存在集群中的任何實例中,因此master將SL0模式授予實例3.然后,實例3將塊從磁盤讀取到其緩沖區(qū)高速緩存。查看x$kjbr和x$kjbl已創(chuàng)建的資源以及已獲取的本地鎖定。STATE為2表示,內(nèi)存塊處于共享模式scur。
Step 2
master節(jié)點將SL0模式授予實例2,因為:
資源上有一個共享鎖(由實例3擁有)。
master節(jié)點上的同一資源沒有共享鎖。
然后,實例2將塊從磁盤讀取到本地緩存中。如果master節(jié)點上存在共享鎖或_cr_grant_local_role為TRUE(11g為AUTO),則行為會存在變化。在這種情況下,master實例將CR請求轉(zhuǎn)發(fā)給共享鎖的實例所有者(實例3),將當(dāng)前緩沖區(qū)發(fā)送到實例2。
Step 3
請求者(實例2)向主(自身)發(fā)送X請求。
Master(實例2)將ping X消息發(fā)送到S鎖持有者(實例3)。
實例3將緩沖區(qū)狀態(tài)從scur轉(zhuǎn)換為CR并關(guān)閉鎖定。
實例3將緩沖區(qū)發(fā)送給請求者(實例2)。
請求者(實例2)將ASSUME發(fā)送給主(自身)以獲得鎖定模式,并通知master前一個持有者(實例3)已關(guān)閉鎖定。
X$BH.STATE顯示1,即當(dāng)前塊(X CURRENT)。
X$KJBR.KJBRROLE顯示0,表示實例2擁有的鎖是XL0,這意味著實例3擁有的鎖已關(guān)閉。
X$BH.STATE從2變?yōu)?(即S變?yōu)镃R)。
Step 4
請求者實例1執(zhí)行更新向master實例(實例2)發(fā)送X請求。master實例(實例2)將ping X發(fā)送到X鎖定持有者(自身)。實例2將緩沖區(qū)狀態(tài)從本地X CURRENT轉(zhuǎn)換為PI。實例2將緩沖區(qū)塊發(fā)送給請求者(實例1)。
請求者(實例1)向主(實例2)發(fā)送ASSUME以獲取鎖定模式,并告知主實例實例1具有全局X鎖定,而實例2具有全局NULL鎖定。
X$BH.STATE從X切換到PI模式。
KJBL.KJBLROLE值24為8 + 16,分別表示PI和GLOBAL(即G1模式)。
X$BH.STATE是1,這是當(dāng)前獨占的。
Step 5
實例3(請求者)將CRREQ(S)發(fā)送到主(實例2)。
master實例(實例2)選擇CR,如下所示:
如果資源角色為G0,則master實例采用存在于它自身buffer cache上的最高版本的PI
否則,如果資源角色為G1,則master實例選擇接近CRREQ中請求的SCN的SCN的PI。
如果資源角色為XL0,則master實例選擇實例當(dāng)前的緩存。
主實例(實例2)將CRREQ轉(zhuǎn)發(fā)到所選實例(自身)。所選實例(實例2)構(gòu)建CR緩沖區(qū)并將其發(fā)送到實例3,實例3不需要DLM鎖。
Step 6
實例1(請求者)向master實例(實例2)發(fā)送W請求(從客戶端到master)。
master(實例2)注冊要寫入的塊的SCN(在DLM資源中)以保存即將要發(fā)生的寫入。master沒有授權(quán)寫入,它向?qū)嵗?發(fā)送W請求,因為實例1具有最高SCN(當(dāng)前塊)。
實例1通過在ping隊列中鏈接緩沖區(qū)來寫入緩沖區(qū)。DBWR執(zhí)行寫入。
實例1向?qū)嵗?(主)發(fā)送W通知。
實例1(主)將設(shè)置資源為本地角色,并將FLUSH_PI發(fā)送到包含PI的每個實例(在本例中為自身)。接收此實例的實例將PI緩沖區(qū)轉(zhuǎn)換為CR緩沖區(qū)并釋放關(guān)聯(lián)的LE。
X$BH.STATE從8變?yōu)?,即從PI緩沖區(qū)到CR緩沖區(qū)。
X$LE表明沒有LE鎖持有CR緩沖區(qū)。
X$KJBL.KJBLROLE變?yōu)?,表示鎖現(xiàn)在是本地的。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。