|
有什么冲突吗?
1:如果提交 SCN 也就是 ITL 中 commit SCN > 查询SCN,查询需要去回滚段中查找数据
2:如果ITL 中没有commit SCN ,分两种情况,一种是活动事务还没有提交将会去回滚段中寻找变化前数据,第二种是 已经结束事务没有标志提交,将会产生delay block cleanout ,将会去回滚段中先寻找 COMMIT SCN 。 这里又分
如果 commit SCN 小于 查询scn,则进行 cleanout 之后就直接读block中数据,如果commit SCN 大于查询scn,则需要读回滚段中数据(这里是一个递归的过程),如果commit SCN 没找到,则找出回滚段事务表中有一个 contril SCN ,是当前事务表中所能找到的最小的一个SCN,如果这个SCN 比查询scn小,则把这个scn当作 commit SCN 更新到 ITL ,并且直接读 block数据,如果这个SCN 大于查询SCN ,则 oracle无法知道 查询scn 和该事务的先后关系,于是产生 1555 错误,这也就是 delay block cleanout 导致的 1555 错误。
一致读 的过程是一个非常复杂的过程! |
|