|
有几个疑问:
1、TRANSACTION TABLE SLOT 什么时候/条件下会被覆盖?
2、对 hqs4500 说的这段:
这样理解正确否?
TRANSACTION SLOT OVERWRITTEN,所以不知该BLOCK的COMMIT SCN与QUERY SCN孰大孰小,所以无从得到
CONSISTENT IMAGE。对吗?
我觉得,TRANSACTION TABLE SLOT 因为被覆盖而造成BLOCK上的XID在TRANSACTION TABLE SLOT找不到
对应值的情况很少,更多的是, 被查询的BLOCK上ITL.UDA 对应的 UNDO BLOCK 被覆盖,而无法读到查询
开始时未修改的数据,所以出现ORA-01555错误。
我不认为 DELAYED BLOCK CLEANOUT 作为产生ORA-1555的一个原因,我觉得是因为:QUERY SCN < BLOCK
上的 COMMIT SCN,则必须到回滚段读修改前的数据,而此时若回滚段上的这些信息被覆盖了,则出现
ORA-01555错误。
若说:“TRANSACTION SLOT OVERWRITTEN,所以不知该BLOCK的COMMIT”,那BLOCK块上的SCN从哪里得来。
3、我还有一种想法:由于修改后的数据并不立刻被写进数据文件,会不会:ORACLE一开始就比较
QUERY SCN 和 BLOCK 块上的 SCN,若BLOCK SCN <= QUERY SCN,并且ITL上无活动/有效的事务信息,
则认为该块上的数据是所需要的?
若上面那个假设成立,那这里必须有个前提:在一开始做DML时候,ORACLE对被修改的块的ITL信息
做了标识,但此时并不把修改后的结果写回去。否则,ORACLE怎么知道会去读取回滚段?
4、有朋友说:ORACLE不会对修改提交后的块做CLEANOUT动作,直到第一次查询该块。
问:此说法是否正确?我有点疑问:ORACLE是凭什么对该块做CLEANOUT动作的?若是
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.
问:万一此Transaction Table上的记录被覆盖,那就做不了CLEANOUT了? |
|