一. Block Cleanout 說明
之前的相關測試參考:
Orace ITL(Interested Transaction List) 說明
OracleBlock scn/commit scn/cleanout scn 說明
block clean out 是指把一個塊中的資料從 dirty 變為 clean,等於告訴後面的人,這個塊裡面的資料是乾淨的,可以放心的使用,本質上是更改 block header 中的一個標誌位。
當commit 的時候,如果被commit 的資料區塊還在 data buffer 中也要被cleanout,因為 commit 的時候並不一定修改block header (delay block cleanout) 。
Clean out有2種: fast commitcleanout和delayed blockcleanout:
Oracle有一個modified block list結構,用來記錄每個transaction更改過的block,每個transaction大約可以記錄10%buffer cache這多的modified block。這部分block就是當發生commit的時候,oracle可以根據modified block list定位到那些塊並做fast commit cleanout。
如果一個transaction修改的塊超過10%buffer cache,那麼超過的塊就執行delayed block cleanout。當做fast commit cleanout時,oracle不會清理 Row lockslb標誌位,ITL lck標誌位。
另一種情況是delayed block cleanout,當transaction還未commit或rollback時modified block已經被寫回磁碟,當發生commit時oracle並不會把block重新讀入做cleanout,這樣成本太高.而是把cleanout留到下一次對此塊的訪問(select,update)時完成。
當delayed cleanout時候如果undo segment header的transaction table slot還沒有被覆蓋,那麼可以找回該事務遞交的exact scn,如果slot已經被覆蓋(ITL被覆蓋),那麼將會使用undo segment header中的control scn來做為upper bound scn。
當發生fast commit cleanout,系統將transaction提交時刻的scn作為commit scn,更新block上 itl和undo segment header的Transaction table的slot上的 scn,並修改block scn,三者是一致的。
發生delayed block cleanout的時候,之前的transaction commit更新的只是undo segment header Transactiontable 上的slot scn,而並未做block上的更新,等待下次使用此block的時候,更新block scn和itl狀態。block scn和itl的更新又分2種情況:
(1)當不產生slot重用的時候, delayedblock cleanout時,根據Transactiontable裡面的資訊,更新blockscn和itl上的Scn/Fsc為transaction曾經提交時候的scn。
(2)當產生slot重用的時候,更新對應itl上scn為undo segment 上的control scn,而block scn 為delayed block cleanout發生時刻的scn。