MySQL锁困惑

标签 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 将在表上设置IX 锁,IX 根据锁兼容性矩阵与IX 兼容在本文档中。

那为什么第 2 个 select for update 被第 1 个阻止了?

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

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

  2. XS 锁可以是表级的,也可以是行级的,对吧?

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

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

最佳答案

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

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

关于MySQL锁困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50484570/

相关文章:

mysql - jsp 使用 mysql 自动完成

mysql - 在 MYSQL 中使用 COUNT 后仅一行

php - Wordpress 无法连接到非常小的站点中的 DB : Too Many Connections,

mysql - 交叉表的动态 MySQL 查询/ View

php - 使用 PHP 和 Mysql Foreach 循环创建多维数组

php - 如何在 PHP 和 MySQL 中使用 foreach 循环插入lastInsertId?

sql - 在 MySQL 语句中使用 OR 有/没有括号有什么不同?

php - SQL 错误 : 1191 - Can't find FULLTEXT index matching the column list

mysql - 使用子查询省略条目

mysql - 按各种列(具有各种联接)进行分组,但对不同的其他列进行求和