only;
session3: update t1 set n1=99 where id = 3; commit; alter system checkpoint;
My session: select id, n1 from t1;
我们在自己的会话查询之前,转储一下数据块的结果,不过转储之前执行一下切换检查点命令(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