1. 程式人生 > 資料庫 >oracle核心管理-讀不阻塞寫過程解析V1

oracle核心管理-讀不阻塞寫過程解析V1

1 過程分析

1 A程序需要讀取5號檔案1234號塊。

2 B程序需要修改5號檔案1234號塊。

步驟1 :A程序在BH中成功設定buffer pin鎖,注意,此時A程序的cbc latch已經釋放,A程序在buffer pin鎖的保護下訪問buffer資料。

步驟2 :B程序想修改buffer,它首先要獲取cbc latch。

步驟3 :B程序檢視BH發現BH中的buffer pin鎖的狀態,發現為其他程序設定的S鎖,B程序會等待嗎,不會!

步驟4:B程序會做很多工作,它會在原來的BH中也留下 共享的buffer pin鎖,然後釋放CBC,在S鎖的保護下,將原來的buffer複製到另外的buffer cache中,增加一個新的BH,這一過程需要CBC的保護下程序,新的BH建立完畢後,釋放CBC,HASH鏈中多了一個一模一樣的bh,buffer cache池中多了一模一樣的buffer。bh中多的以上status表示為buffer的狀態,原buffer中status為XCUR,新的未有值。

步驟5,:在源buffer成功複製到另外一個buffer後,原來的cbc latch多增加一個BH,首先獲取cbc,將原來的buffer status列修改為CR,新bh中的status為XCUR,同時在buffer pin修改為X,進行修改buffer。

步驟6:釋放cbc latch,在獨佔buffer pin鎖的狀態下修改buffer。

步驟7:如果此時有C程序需要修改這個buffer中的其他資料行,則需要進行等待,等待為buffer busy waits。

XCUR是當前塊,CR為一致性讀取塊。

2 過程總結

讀不堵塞寫的原理為將正在讀取的資料塊轉化為CR塊,複製新的資料塊進行修改狀態為XCUR(當前塊),修改buffer pin為X。

3 圖例資訊