之前的相关测试参考:
当commit 的时候,如果被commit 的数据块还在 data buffer 中也要被cleanout,因为 commit 的时候并不一定修改block header (delay block cleanout) 。
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标志位。
,当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。
系统将transaction提交时刻的scn作为commit scn,更新block上 itl和undo segment header的Transaction table的slot上的 scn,并修改block scn,三者是一致的。
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。