再试试不同的块
操作前先查看下X$BH:
SQL> select addr,tch from x$bh where dbarfil=5 and dbablk=41;
ADDR TCH
-------- ----------
080B51BC 67
接着刚才的实验,我又访问了不同的块:
SQL> select * from jj_3 where rowid='AAAMvjAAKAAAAEeAAA'(在块286上);
ID NA
---------- --
4 aa
再次查看X$BH的结果是:
SQL> select addr,tch from x$bh where dbarfil=5 and dbablk=41;
ADDR TCH
-------- ----------
080B51BC 67
结果很明显了,用rowid访问不同的块,是不会增加TCH值的。也就是说不会有CR块产生。
在晶晶实验六中,已经证明了在生成CR块时,oracle可以根据数据块头部的ITL槽中的UBA,找到存放数据块回滚信息的回 滚块和回滚记录,通过这个UBA就可以构造CR块咯,oracle为什么还要再去访问事务表呢?这是因为,oracle的提交有时会 是延迟提交。oracle并不清除延迟提交所涉及的块中的事务信息,如:事务所占ITL槽和行锁。而把清除事务信息这个操作 放到了以后的块清除中(块清除在以后的实验会详细讲述),oracle这样做的目的是为加快提交速度。如果一个事务涉及到了过多的块,单单是提交时清除每个块中的事务信息就需要耗费很长时间。这降低了提交速度。有可能使提交成为最易
引起争用的操作。当事务提交时,对事务所涉及的块,不做任何操作,块将保持事务仍在持续时的信息。当一个select操作 查询到这个块时,ITL槽中的提交标志为未提交,但实际上这个事务是已经提交的。就是因为有了延迟提交oracle无法根 据ITL槽中的提交标志来判断一个块中的事务是否真的提交。他必须根据ITL中的XID 去访问事务表。才能确定此块中的事务是否真的提交。在生成CR块前,oracle先要判断是否真的有必要为此块生成CR块。这就要去访问事务表。