Undo段
对于insert操作,回滚段只需要记录插入的rowid,回退时根据rowid删除记录
对于update操作,回滚段只需要记录被更新字段的旧值即可(前镜像),回退时通过旧值覆盖新值
对于delete操作,回滚段记录整行的数据,回退时通过反向(insert)操作恢复删除数据
所以此三者操作insert将产生最少的undo,update次之,delete最多
修改记录步骤:
1,事务开始时,在回滚段上分配一个事务槽
2,在数据块头部获取一个ITL事务槽,该事务槽指向回滚段的事务槽
3,修改数居前,记录前镜像信息,并以undo record的形式记录在回滚段中,回滚段事务槽指向该记录
4,锁定修改行,修改行锁定位(lb-lock byte)指向ITL事务槽
5,进行数据修改
-------------------------------------------------
修改数据后,commit,oracle将回滚段上的事务信息标记为inactive,并释放锁信息,ITL事务信息
数据块上存储了ITL和锁定等事物信息,oracle必须在事务提交之后清楚这些事务数据,这就叫做块清除
如果修改的数据任然在Buffer Cache中,那么oracle可以立即清除ITL信息,这叫快速清楚 fast block cleanout,不过有一个限制,如果修改的块数据量超过Buffer Cache的10%,则超出不份不立即清除,而是选择延迟清楚(delayed Block Cleanout),修改的数据如果已经被写到数据文件上,oracle也会选择延迟清除,从而提高性能
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24217871/viewspace-679680/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24217871/viewspace-679680/