一致读( consistent read )的步骤

一致读( consistent read )的步骤
===========================================================

摘自http://www.itpub.net/131231.html 。不知道具体出处,拿来参考。


1. Read the Data Block.

2. Read the Row Header.

3. Check the Lock Byte to determine whether there's an ITL entry.

4. Read the ITL entry to determine the Transaction ID (Xid).

5. Read the Transaction Table using the Transaction ID. If the transaction has been committed and has a System Commit Number less than the query's System Change Number, update the status of the block (block cleanout) and start over at step 1.

6. Read the last undo block (Uba).

7. Compare the block transaction ID with the transaction table transaction ID. If the Transaction ID in the undo block doesn't equal the Transaction ID from the Transaction Table, then issue ORA-1555, Snapshot Too Old.

8. If the Transaction IDs are identical, make a copy of the data block in memory. Starting with the head undo entry, apply the changes to the copied data block.

9. If the tail undo entry (the actual first undo entry in the chain, or the last in the chain going backwards!) indicates another data block address, read the indicated undo block into memory and repeat steps 7 and 8 until the undo entries don't contain a value for the data block address.

10. When there's no "previous data block address," the transaction has been completely undone.

11. If the undo entry contains:

a. a pointer to a previous transaction undo block address, read the Transaction ID in the previous transaction undo block header and read the appropriate Transaction Table entry. Return to step 5.

b. an ITL record, restore the ITL record to the data block. Return to step 4.

参考:

http://www.jlcomp.demon.co.uk/cleanout.html
http://www.ixora.com.au/tips/admin/ora-1555.htm

将一致读的步骤细化一点,请指正:

从第5步开始:
IF 在Transaction Table 中根据Transaction ID 找到transaction
IF transaction 已经commit
IF query scn>commit scn
则接受该块,进行clean out,返回1
ELSEIF query scn 则进行一致性读,从第8步向后执行
ELSEIF transaction 没有commit
也进行一致性读,从第8步向后执行

ELSEIF 在Transaction Table 中没有找到transaction(回滚信息被覆盖了,也说明事务已经提交,因为只有提交后所在的undo extent才能被覆盖。这样query scn则去比较control scn。control scn是指事务表中最近一次被重用的transaction slot的前一个事务的commit scn,也就是事务表中所能找到的最小的commit scn了)
IF query scn 则无法知道query scn和commit scn得大小关系,出现ORA-01555错误
IF query scn>control scn
则query scn肯定>commit scn
则接受该块,进行clean out,并将block 中ITL标记上“U”,表示“upper bound commit” ,并返回1

参考:http://www.itpub.net/showthread.php?threadid=131231&pagenumber=2
http://blog.itpub.net/post/26/2507

[@more@]

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

转载于:http://blog.itpub.net/7916042/viewspace-891042/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值