ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle进行update时对行加锁的测试

oracle进行update时对行加锁的测试

原创 Linux操作系统 作者:tyoodz 时间:2011-05-16 18:27:19 0 删除 编辑


最近正好学习到锁,网上都说在更新一些行之前要把这些行全部锁起来后在更新。比如说,要更新10000行,就会先把这10000
行加行锁,然后更新。本人进行了一下实验


session 1:
created table p (id int);
insert into p values (1);
insert into p values (2);
insert into p values (3);
insert into p values (4);
commit;

session 2:
delete from p where id = 4;

session 3:
select addr ,used_ublk from v$transaction;
ADDR      USED_UBLK
-------- ----------
333B5938          1
选中一条结果,说明session 2中用掉了回滚段中的一个block。

接着返回session 1:
update p set id = 10 where id <= 4;
发现session 1被堵塞

返回session 3 接着运行那条语句
sys@ORCL>/

ADDR      USED_UBLK                    ADDR      USED_UBLK        
-------- ----------                    -------- ----------
3338CE20          1                    333B5938          1    //上次的
333B5938          1                 

发现比上次多了一个3338CE20,那多出的这条只能是session 1的了,发现session 1也用了一块回滚段的块,那是不是
可以说明session 1已经进行更新了?但是session 1正在被堵塞,那么可不可以说明:oracle在更新的时候并不是把想要
更新的行全部加锁之后在进行更新,而是一边进行加锁一边进行更新??

回滚全部后

session 2:

delete from p set id = 1;//id为1
已删除 1 行。
session 3:
sys@ORCL>select addr ,used_ublk from v$transaction;

ADDR      USED_UBLK
-------- ----------
333B5938          1

session 1:
update p set id = 10 where id <= 4;
被堵塞

session 3:

sys@ORCL>/

ADDR      USED_UBLK
-------- ----------
333B5938          1      

没有出现session 1的条目,只有session 2,因为session 2把id为1的加锁了,session 1从一开始就被堵塞,所以一行
也没更新。

本人初学者,不知道这么理解对不对,请大家指点一下~~

 

 


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25361369/viewspace-695502/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-05-16

  • 博文量
    55
  • 访问量
    75085