ORA-01555: snapshot too old: rollback segment number 问题剖析下

下面接着上文介绍。

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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30430420/viewspace-1796529/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30430420/viewspace-1796529/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值