锁 (S,X,IS,IX) 如何在 Mysql 中使用 FOR UPDATE/LOCK IN SHARE MODE 之类的查询?
How locks (S,X,IS,IX) work in Mysql with queries like FOR UPDATE/LOCK IN SHARE MODE?
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锁锁定table行,用S锁锁定select行。
当一行被S锁定时lock.How是否可以在不释放锁的情况下修改它?
修改it.Right需要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 将整个 table 锁定为 IX 模式,并将 selected 行锁定为 X 模式。
由于 X 模式与 S 模式不兼容,那么为什么 select 在第二个会话中执行查询?
一个答案可能是 select 查询不要求 S 锁,这就是为什么它在第二个会话中 运行 successfully.But 更新查询也不要求 X 锁,但是当您执行它时,它开始等待 session1 持有的锁。
我已经阅读了很多与此相关的内容,但无法清除我的 doubts.Please 帮助。
Bill Karwin 通过 email.He 回答了这个问题说:
持有S锁的同一个事务可以将锁提升为X锁。这不是冲突。
会话 1 中的 SELECT FOR UPDATE 获取 X 锁。没有指定锁定子句的简单 SELECT 查询不需要获取 S 锁。
任何UPDATE 或DELETE 都需要获取X 锁。这是隐含的。这些语句没有任何特殊的锁定子句。
有关 IS/IX 锁和 FOR UPDATE/LOCK 共享模式的更多详细信息,请访问
shared-and-exclusive-locks.
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锁锁定table行,用S锁锁定select行。
当一行被S锁定时lock.How是否可以在不释放锁的情况下修改它? 修改it.Right需要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 将整个 table 锁定为 IX 模式,并将 selected 行锁定为 X 模式。
由于 X 模式与 S 模式不兼容,那么为什么 select 在第二个会话中执行查询?
一个答案可能是 select 查询不要求 S 锁,这就是为什么它在第二个会话中 运行 successfully.But 更新查询也不要求 X 锁,但是当您执行它时,它开始等待 session1 持有的锁。
我已经阅读了很多与此相关的内容,但无法清除我的 doubts.Please 帮助。
Bill Karwin 通过 email.He 回答了这个问题说:
持有S锁的同一个事务可以将锁提升为X锁。这不是冲突。
会话 1 中的 SELECT FOR UPDATE 获取 X 锁。没有指定锁定子句的简单 SELECT 查询不需要获取 S 锁。
任何UPDATE 或DELETE 都需要获取X 锁。这是隐含的。这些语句没有任何特殊的锁定子句。
有关 IS/IX 锁和 FOR UPDATE/LOCK 共享模式的更多详细信息,请访问 shared-and-exclusive-locks.