MySQL锁定混乱

时间:2018-05-23 09:22:56

标签: mysql

Mysql 5.6 Innodb可重复读取隔离级别。

T1                                        T2
select ... where id = 1 for update
                                          select ... where id = 1 for update
首先运行

T1,然后执行T2,它们处于单独的事务中。

结果是select for update T2被阻止。

根据{{​​3}}, select for update会在表格上设置IX锁定,IXIX兼容,基于本文档中的锁兼容性矩阵。

那么为什么第二个select for update被第一个阻止?

我搜索了一些关于这个问题的帖子,现在我也有以下与之相关的问题:

  1. select for update会先在桌面上设置IX,然后在匹配索引/行上设置X,对吗?

  2. XS锁可以是表级或行级,对吗?

  3. https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html的锁定类型兼容性矩阵中,XS表示表级锁,而不是行级,对吧?

  4. 第二个select for update被屏蔽,因为第一个select for update在表格上设置了IX,在匹配的索引/行上设置了X,所以当第二个select for update时在表上设置IX,没关系。但是当它设置X后者时,它会被屏蔽,因为它已被X设置为select for update,对吗?

1 个答案:

答案 0 :(得分:1)

"那么为什么第二次选择更新会被第一次阻止?" - 因为这是拥有独占(X)锁定的重点。

  1. 是的。
  2. 右键。