下面接着上文介绍。
Oracle在更新数据块时,会在回滚段中记录这一更新动作,并且会产生一个SCN,在回滚段中,会有对应的一个事务ID。在事务提交前,会在数据块头记录下这个SCN,事务ID,回滚地址,如前面说的指针中。并且会在事务列表中设置一个锁,用于记录这个事务在这个数据块中产生的锁的数目,同时在对应修改的数据记录上放以一个行级锁。当事务提交时,并不会全不清除,只是在事务列表中做上相应标记,告诉后面访问该数据块的事务,那些事务已经提交了,如果发现前面的事务没有提交,并要访问的数据块记录被锁住了,就会被阻塞。否则只有清除相应的锁标志,并提交自己的锁标志,循环该动作。这就叫做延迟块清除。
下面通过几个事务的演示来理解。
1)未更改前
这有两个事务01、02以及用于记录覆盖事务的03

2)现在更新row2,这样会在数据块头指向回滚段(5.3),标记为未提交(active)

3)接下来,提交该事务。
随后,其再次访问数据块500,我们可以看到数据块的报头中,显示数据块未提交的更改

4)其它用户访问数据块500
Oracle用数据块头来查询相应的回滚段事务列表,识别是否对数据块500有变更操作的记录,以反映数据块的真实状态,即执行了延迟块的清除。

总结为有以下两个原因会导致
* 回滚段信息被覆盖掉,从而导致Oracle无法回滚(提交)事务回到起始数据。
* 在回滚段的事务列表中的transaction slot被覆盖,并且Oracle无法回滚事务头,来获取原回滚段transaction slot
* 回滚段信息被覆盖掉,从而导致Oracle无法回滚(提交)事务回到起始数据。
* 在回滚段的事务列表中的transaction slot被覆盖,并且Oracle无法回滚事务头,来获取原回滚段transaction slot
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30430420/viewspace-1796529/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30430420/viewspace-1796529/