【发布时间】:2015-10-31 01:02:31
【问题描述】:
1:
我正在尝试这个,它工作正常:
start transaction;
select * from orders where id = 21548 LOCK IN SHARE MODE;
update orders set amount = 1500 where id = 21548;
commit;
根据LOCK IN SHARE MODE的定义,用IS锁锁定表,用S锁锁定选中的行。
当一行被S锁锁定时,如何修改不释放锁? 它需要X锁来修改它。对吧?还是只对不同的连接交易有效?
2:
//session1
start transaction;
select * from orders where id = 21548 FOR UPDATE;
保持这个 session1 不变,然后在不同的 session 中尝试:
//session2
select * from orders where id = 21548; //working
update orders set amount = 2000 where id = 21548; //waiting
FOR UPDATE 将整个表锁定为 IX 模式,并将选定的行锁定为 X 模式。
由于 X 模式与 S 模式不兼容,那么如何在第二个会话中执行选择查询?
一个答案可能是 select 查询没有请求 S 锁,这就是它运行成功的原因。但是第二个会话中的更新查询也没有请求 X 锁,但是当您执行它时,它开始等待持有的锁按会话 1。
我已经阅读了很多关于此的内容,但无法消除我的疑问。请帮忙。
【问题讨论】:
标签: mysql database concurrency transactions locking