最近正好学习到锁,网上都说在更新一些行之前要把这些行全部锁起来后在更新。比如说,要更新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从一开始就被堵塞,所以一行
也没更新。
本人初学者,不知道这么理解对不对,请大家指点一下~~