【发布时间】:2018-05-23 09:22:56
【问题描述】:
Mysql 5.6 Innodb 可重复读取隔离级别。
T1 T2
select ... where id = 1 for update
select ... where id = 1 for update
T1 先运行,再执行T2,它们在不同的事务中。
结果是T2 的select for update 被阻止。
根据https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html,
select for update 将在表上设置IX 锁,并且IX 与IX 兼容基于本文档中的锁兼容性矩阵。
那为什么第二个select for update 被第一个屏蔽了?
我搜索了一些关于这个问题的帖子,现在我也有以下相关问题:
select for update会先在表上设置IX,然后在匹配索引/行上设置X,对吧?X和S锁可以是表级或行级的,对吧?在https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html的锁类型兼容性矩阵中,
X和S是表级锁,不是行级锁,对吧?第二个
select for update被阻塞,因为第一个select for update在表上设置了IX,在匹配的索引/行上设置了X,所以当第二个select for update在表上设置IX时,就可以了.但是当它设置X后者时,它被阻止了,因为它已经被第一个select for update设置了X,对吧?
【问题讨论】:
标签: mysql