Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 数据库 / MySQL / Oracle数据库通过undo保证一致性读和不发生脏读

不发生脏读,用户A对表更新了,没有提交,用户B对进行查询,没有提交的更新不能出现在用户的查询结果中。实例模拟:表test中的数据如下
1,用户A查询:SQL> select * from test;
        ID NAME
---------- ----------
         1 A
         2 B
2,用户B:update test set name="C" where id=1;没有提交3,用户A再次查询:SQL> select * from test;
        ID NAME
---------- ----------
         1 A
         2 B查询到数据块的信息select id, rowid, dbms_rowid.rowid_relative_fno(rowid) fn,dbms_rowid.rowid_block_number(rowid) bk from test order by id
这时候dump 数据块(内存中的数据块) alter system dump datafile 4 block 6717,Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0003.02d.00000323  0x008001c5.0297.0d  C---    0  scn 0x0000.0022cf82
0x02   0x0006.020.00000320  0x0080048c.017d.03  ----    1  fsc 0x0000.00000000
 
。。。。
block_row_dump:
tab 0, row 0, @0x1f90
tl: 8 fb: --H-FL-- lb: 0x2  cc: 2
col  0: [ 2]  c1 02
col  1: [ 1]  43
tab 0, row 1, @0x1f88
tl: 8 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 03
col  1: [ 1]  42
end_of_block_dump
发现id=1的值已经更改了,43(16进制对应的是C),那么A用户得到值为什么还是A呢这是因为Oracle发现这条数据有lb: 0x2 对应的是ITL,从ltl为0x02的记录看到flag为----,表示有事务标记,数据被加锁,需要从undo段的uba(undo block address)中读取。在undo段中对应的块信息是0x0080048c,这里的数字是16进制的,先将其转为10进制:select to_number("0080048c","XXXXXXXXXXXXXXX") from dual 得到值8389772
  • 1
  • 2
  • 下一页
Oracle 加在表上的锁类型Oracle中用sys用户建表权限不足相关资讯      Oracle基础教程 
  • Oracle块编程返回结果集详解  (11/10/2013 10:45:58)
  • Oracle基础教程之设置系统全局区  (08/22/2013 14:24:00)
  • Oracle基础教程知识点总结  (06/18/2013 07:43:32)
  • Oracle基础教程之tkprof程序详解  (10/22/2013 11:49:50)
  • Oracle基础教程之sqlplus汉字乱码  (07/18/2013 16:30:00)
  • Oracle 管理之 Linux 网络基础  (02/16/2013 18:37:35)
本文评论 查看全部评论 (0)
表情: 姓名: 字数