要明确一个概念,DBWR的写入与commit没有关系,即使事务未提交,也是可以写回数据文件的。
oracle在执行一些DML操作时,会在block上有活动事务的标志,如果一个事务commit后,由于某些block在commit之前已经写回datafile, 或者事务影响到的block数过多,则commit的时候只会清理undo segment header中的事务标志信息,data block上的事务标志不会清除,否则代价过高。那么Oracle就会在读取这些block时,将这些事务标志进行清除,就是延迟块清除.
(1)快速块清除(fast block cleanout), 当事务修改的数据块全部保存在buffer cache 并且修改数据块的数据量没有超过 cache buffer 的 10%,快速清除事务信息。
(2)延迟块清除(delayed block cleanout) 当修改的数据块的阀值超过10% 或者本次事务相关的数据块已经被刷出了buffer cache, oracle 会下次访问此block 时再清除事务信息。