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 圖例信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章