锁 (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 回答了这个问题说:

  1. 持有S锁的同一个事务可以将锁提升为X锁。这不是冲突。

  2. 会话 1 中的 SELECT FOR UPDATE 获取 X 锁。没有指定锁定子句的简单 SELECT 查询不需要获取 S 锁。

任何UPDATE 或DELETE 都需要获取X 锁。这是隐含的。这些语句没有任何特殊的锁定子句。

有关 IS/IX 锁和 FOR UPDATE/LOCK 共享模式的更多详细信息,请访问 shared-and-exclusive-locks.