【问题标题】:How locks (S,X,IS,IX) work in Mysql with queries like FOR UPDATE/LOCK IN SHARE MODE?Mysql 中的锁(S、X、IS、IX)如何通过 FOR UPDATE/LOCK IN SHARE MODE 等查询工作?
【发布时间】: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


    【解决方案1】:

    Bill Karwin 通过电子邮件回答了这个问题。他说:

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

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

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

    有关 IS/IX 锁和 FOR UPDATE/LOCK IN SHARE MODE 的更多详细信息,请访问 shared-and-exclusive-locks.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多