首页 > 解决方案 > MySQL锁混乱

问题描述

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

T1                                        T2
select ... where id = 1 for update
                                          select ... where id = 1 for update

T1先运行,然后执行T2,它们在单独的事务中。

结果是select for updateT2阻塞了。

根据https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html, 将在表上select for update设置锁,并与本文档中的锁兼容性矩阵兼容。 那为什么第二个被第一个挡住了? 我搜索了一些关于这个问题的帖子,现在我也有以下相关问题: IXIXIX

select for update



  1. select for updateIX首先在表上设置,然后X在匹配索引/行上设置,对吗?

  2. X并且S锁可以是表级或行级的,对吗?

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

  4. 第二个select for update阻塞,因为第一个select for update已经设置IX在表和X匹配的索引/行上,所以当第二个select for update设置IX在表上时,就可以了。但是当它设置X为后者时,它会被阻止,因为它已被设置X为 1st select for update,对吧?

标签: mysql

解决方案


“那为什么第二次选择更新被第一次阻止了?” - 因为这是拥有独占(X)锁的全部意义。

  1. 是的。
  2. 是的。
  3. 是的。
  4. 对。

推荐阅读