我们在自己的会话查询之前,转储一下数据块的结果,不过转储之前执行一下切换检查点命令(alter system checkpoint;),使改变刷新输出到磁盘。
?
?
Itl ? ? ? ? ? Xid ? ? ? ? ? ? ? ? ?Uba ? ? ? ? Flag ?Lck ? ? ? ?Scn/Fsc 0x01 ? 0x0009.010.0000062d ?0x00c00712.0127.07 ?--U- ? ?1 ?fsc 0x0000.0034a241 --flag U 代表上界提交,意思是这个事务已经提交,只是目前标记还没清理。 0x02 ? 0x0005.018.0000062a ?0x00c0068a.013f.2f ?---- ? ?1 ?fsc 0x0000.00000000 ----锁住的是id为1的行,为会话1所锁住的行 bdba: 0x00416169 data_block_dump,data header at 0x1cd0825c =============== tsiz: 0x1fa0 hsiz: 0x18 pbl: 0x1cd0825c ? ? ?76543210 flag=-------- ntab=1 nrow=3 frre=-1 fsbo=0x18 fseo=0x1f71 avsp=0x1f6b tosp=0x1f6b block_row_dump: tab 0, row 0, @0x1f7b tl: 10 fb: --H-FL-- lb: 0x2 ?cc: 2 -- 事务0x2似乎锁住了这一行,其实是锁住了这一行 col ?0: [ 2] ?c1 02 col ?1: [ 3] ?c2 02 02 tab 0, row 1, @0x1f71 tl: 10 fb: --H-FL-- lb: 0x0 ?cc: 2 col ?0: [ 2] ?c1 03 col ?1: [ 3] ?c2 02 03 tab 0, row 2, @0x1f85 tl: 9 fb: --H-FL-- lb: 0x1 ?cc: 2 -- 事务0x1似乎锁住了这一行,其实没有锁住,只是锁标记没有清除 col ?0: [ 2] ?c1 04 col ?1: [ 2] ?c1 64 end_of_block_dump执行查询之后,转储数据块结果(需要先执行alter system checkpoint;)
?
?
Itl ? ? ? ? ? Xid ? ? ? ? ? ? ? ? ?Uba ? ? ? ? Flag ?Lck ? ? ? ?Scn/Fsc 0x01 ? 0x0009.010.0000062d ?0x00c00712.0127.07 ?C--- ? ?0 ?scn 0x0000.0034a241 -- flag C 已提交并清除完成,表明,查询会将已提交的数据清除标记。 0x02 ? 0x0005.018.0000062a ?0x00c0068a.013f.2f ?---- ? ?1 ?fsc 0x0000.00000000 --- 锁住的是id为1的行,为会话1所锁住的行 bdba: 0x00416169 data_block_dump,data header at 0x1cd0825c =============== tsiz: 0x1fa0 hsiz: 0x18 pbl: 0x1cd0825c ? ? ?76543210 flag=-------- ntab=1 nrow=3 frre=-1 fsbo=0x18 fseo=0x1f71 avsp=0x1f6b tosp=0x1f6b block_row_dump: tab 0, row 0, @0x1f7b tl: 10 fb: --H-FL-- lb: 0x2 ?cc: 2 -- 事务0x2似乎锁住了这一行,其实是锁住了这一行。 col ?0: [ 2] ?c1 02 col ?1: [ 3] ?c2 02 02 tab 0, row 1, @0x1f71 tl: 10 fb: --H-FL-- lb: 0x0 ?cc: 2 col ?0: [ 2] ?c1 03 col ?1: [ 3] ?c2 02 03 tab 0, row 2, @0x1f85 tl: 9 fb: --H-FL-- lb: 0x0 ?cc: 2 --锁标记已经被清除了。 col ?0: [ 2] ?c1 04 col ?1: [ 2] ?c1 64 end_of_block_dump
3.4 真实的查询操作
? ? ? ? 我们知道,如果我们需要查询一个数据,假设我们是事务1,开始于1:00,于1:05分开始查找A表记录1号。另一个事务2于1:01开始,在1:05分之前将A表记录1号修改了3遍,比如最开始记录1号的值是1,另一个事务将其由1改成2,又改成了3,最后改成了4。另一个事务2于1:10提交的。这样我们的事务1查找的记录1号的值应该为1,但是数据块里面的值已经被修改好几遍了,而且已经变成了4。那么oracle是怎么找到原始值1的呢。下面让我们通过一个小例子来解释这种现象:
? ? ? ?其实,就是讲前面的步骤在执行一下,原谅我直接将上面的命令再拷贝一部分放在下面:(sys用户登录)
? ? ? 3.4.1 准备工作
execute dbms_random.seed(0) set doc off doc end doc is marked with # # set linesize 120 set trimspool on set pagesize 24 set arraysize 25 -- set longchunksize 32768 -- set long 32768 set autotrace off clear breaks ttitle off btitle off column owner format a15 column segment_name format a20 column table_name format a20 column index_name format a20 column object_name format a20 column subobject_name format a20 column partition_name format a20 column subpartition_name format a20 column column_name format a20 column column_expression format a40 word wrap column constraint_name format a20 column referenced_name format a30 column file_name format a60 column low_value format a24 column high_value format a24 column parent_id_plus_exp format 999 column id_plus_exp format 990 column plan_plus_exp format a90 column object_node_plus_exp format a14 column other_plus_exp forma