oracle中update锁记录,oracle进行update时对行加锁的测试

最近正好学习到锁,网上都说在更新一些行之前要把这些行全部锁起来后在更新。比如说,要更新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 接着运行那条语句

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:

addr ,used_ublk from v$transaction;

ADDR      USED_UBLK

-------- ----------

333B5938          1

session 1:

update p set id = 10 where id <= 4;

被堵塞

session 3:

ADDR      USED_UBLK

-------- ----------

333B5938          1

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

也没更新。

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

001.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值