Mysql 5.6 Innodb 可重复读隔离级别。
T1 T2
select ... where id = 1 for update
select ... where id = 1 for update
T1
先运行,然后执行T2
,它们在不同的事务中。
结果是 select for update
的 T2
被阻止。
根据https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html ,
select for update
将在表上设置IX
锁,IX
根据锁兼容性矩阵与IX
兼容在本文档中。
那为什么第 2 个 select for update
被第 1 个阻止了?
我搜索了一些关于这个问题的帖子,现在我也有以下与之相关的问题:
select for update
将首先在表上设置IX
,然后在匹配索引/行上设置X
,对吗?X
和S
锁可以是表级的,也可以是行级的,对吧?在https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html的锁类型兼容性矩阵中,
X
和S
表示表级锁,而不是行级锁,对吧?第 2 个
select for update
被阻止,因为第 1 个select for update
已经在表上设置了IX
和X
在匹配的索引/行上,所以当第二次select for update
在表上设置IX
时,就可以了。但是当它在后面设置X
时,它被阻止了,因为它已经被第一个select for update
设置为X
,对吧?
最佳答案
“那为什么第二次选择更新被第一次阻止了?” - 因为这就是拥有独占 (X) 锁的全部意义。
- 是的。
- 是的。
- 是的。
- 对。
关于MySQL锁困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50484570/