MySQL5.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` 锁在table上,然后 `IX` 与兼容 `IX` 基于本文档中的锁兼容性矩阵。
那为什么是第二 `select for update` 被1挡了吗?
我搜索了一些关于这个问题的帖子,现在我也有以下与之相关的问题: `select for update` 将设置 `IX` 先放在table上,然后放好 `X` 在匹配索引/行上,对吗? `X` 以及 `S` 锁可以是表级的,也可以是行级的,对吗?
的锁型相容矩阵https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html,的 `X` 以及 `S` 意思是表级锁,而不是行级锁,对吗?
第二 `select for update` 阻止,因为 `select for update` 已设置 `IX` 在table上 `X` 在匹配的索引/行上,所以当 `select for update` 套 `IX` 在table上,可以。但是当它开始的时候 `X` 后者由于已设置而被阻止 `X` 到1号 `select for update` ,对吧?
1条答案
按热度按时间wfauudbj1#
“那么为什么第二次选择更新会被第一次阻止?”—因为这就是拥有独占(x)锁的关键所在。
对。
对。
是的。
正确的。