<form id="tznrh"><form id="tznrh"><th id="tznrh"></th></form></form>




            PCM鎖資源存儲方式有兩種,1.如果PCM鎖屬于本地實例,那么它會被存儲在本地實例的LE結構中。2.如果PCM鎖屬于遠程實例那么它將會被分配存儲在本地實例的共享池中。

            kclle結構:

            kcllerls表示release;

            kcllelnm表示 name(id1,id2);

            kcllemode表示 hold-mode;

            kclleacq表示 acquiring;

            kcllelck表示 DLM鎖。

            kjbr結構:

            resname_kjbr [2]表示資源名稱;

            grant_q_kjbr表示grant queue;

            ert_q_kjbr表示轉換隊列;

            mode_role_kjbr,它表示授權模式和角色:NULL(0x00),S(0x01),X(0x02),L0本地(0x00),G0全局沒有PI(0x08),G1全局有PI(0x018)。

            kjbl中的字段mode_role_kjbl是表示鎖定模式:

            0x00表示為NULL模式

            01表示為S模式

            0x02表示為X;

            0x04表示為master節點打開鎖;

            0x08表示為全局角色;

            0x10表示為存在PI;

            0x20表示為CR請求;

            表示為S模式請求;

            0x80表示為X模式請求。


            示例


            SELECT * FROM emp WHERE empno = ...;
            UPDATE emp SET sal = sal + 10 WHERE empno = ...; COMMIT; ALTER SYSTEM CHECKPOINT LOCAL;1


            1.鎖定和塊請求,遠程master

            2.鎖定和塊請求,本地master,共享模式

            3.鎖轉換,鎖降級

            4.塊融合,寫/寫

            5.塊融合,寫/讀(CR)

            6.寫入涉及鎖定,丟棄PI

            7.塊融合寫/讀,類似于步驟5


             
             

            Step 1

            最開始表未被緩存在集群中的任何實例中,因此master將SL0模式授予實例3.然后,實例3將塊從磁盤讀取到其緩沖區高速緩存。查看x$kjbr和x$kjbl已創建的資源以及已獲取的本地鎖定。STATE為2表示,內存塊處于共享模式scur。


            Step 2

            master節點將SL0模式授予實例2,因為:

            資源上有一個共享鎖(由實例3擁有)。

            master節點上的同一資源沒有共享鎖。

            然后,實例2將塊從磁盤讀取到本地緩存中。如果master節點上存在共享鎖或_cr_grant_local_role為TRUE(11g為AUTO),則行為會存在變化。在這種情況下,master實例將CR請求轉發給共享鎖的實例所有者(實例3),將當前緩沖區發送到實例2。


            Step 3

            請求者(實例2)向主(自身)發送X請求。

            Master(實例2)將ping X消息發送到S鎖持有者(實例3)。

            實例3將緩沖區狀態從scur轉換為CR并關閉鎖定。

            實例3將緩沖區發送給請求者(實例2)。

            請求者(實例2)將ASSUME發送給主(自身)以獲得鎖定模式,并通知master前一個持有者(實例3)已關閉鎖定。

            X$BH.STATE顯示1,即當前塊(X CURRENT)。

            X$KJBR.KJBRROLE顯示0,表示實例2擁有的鎖是XL0,這意味著實例3擁有的鎖已關閉。

            X$BH.STATE從2變為3(即S變為CR)。


            Step 4

            請求者實例1執行更新向master實例(實例2)發送X請求。master實例(實例2)將ping X發送到X鎖定持有者(自身)。實例2將緩沖區狀態從本地X CURRENT轉換為PI。實例2將緩沖區塊發送給請求者(實例1)。

            請求者(實例1)向主(實例2)發送ASSUME以獲取鎖定模式,并告知主實例實例1具有全局X鎖定,而實例2具有全局NULL鎖定。

            X$BH.STATE從X切換到PI模式。

            KJBL.KJBLROLE值24為8 + 16,分別表示PI和GLOBAL(即G1模式)。

            X$BH.STATE是1,這是當前獨占的。



            Step 5

            實例3(請求者)將CRREQ(S)發送到主(實例2)。master實例(實例2)選擇CR,如下所示:

            如果資源角色為G0,則master實例采用存在于它自身buffer cache上的最高版本的PI

            否則,如果資源角色為G1,則master實例選擇接近CRREQ中請求的SCN的SCN的PI。

            如果資源角色為XL0,則master實例選擇實例當前的緩存。

            主實例(實例2)將CRREQ轉發到所選實例(自身)。所選實例(實例2)構建CR緩沖區并將其發送到實例3,實例3不需要DLM鎖。


            Step 6

            實例1(請求者)向master實例(實例2)發送W請求(從客戶端到master)。

            master(實例2)注冊要寫入的塊的SCN(在DLM資源中)以保存即將要發生的寫入。master沒有授權寫入,它向實例1發送W請求,因為實例1具有最高SCN(當前塊)。

            實例1通過在ping隊列中鏈接緩沖區來寫入緩沖區。DBWR執行寫入。

            實例1向實例2(主)發送W通知。

            實例1(主)將設置資源為本地角色,并將FLUSH_PI發送到包含PI的每個實例(在本例中為自身)。接收此實例的實例將PI緩沖區轉換為CR緩沖區并釋放關聯的LE。

            X$BH.STATE從8變為3,即從PI緩沖區到CR緩沖區。

            X$LE表明沒有LE鎖持有CR緩沖區。

            X$KJBL.KJBLROLE變為0,表示鎖現在是本地的。




            沃趣科技,讓客戶用上更好的數據庫技術!
            三分快3