mysql - MySQL 中的 UPDATE ... WHERE 事务是否会锁定从子查询引用的其他表中的行?

标签 mysql sql-update innodb database-locking

在 MySQL(使用 InnoDB 和 REPEATABLE READ 隔离级别)中发出包含如下子查询的 UPDATE 语句时:

UPDATE bar INNER JOIN (SELECT i1, i2 FROM foo) inner 
   ON bar.b1 = inner.i1 
   SET bar.b2 = inner.i2)

InnoDB 引擎是只锁定 bar 表中所有受影响的行,还是锁定 foo 表中的所有访问行(共享或独占)整个查询的持续时间?

JOIN 与子查询有什么区别吗?

最佳答案

好像是InnoDB will indeed acquire在此类查询期间共享锁。我已经使用子查询中的 SLEEP 语句和来自另一个 session 的同步更新验证了这一点。

我能够使用临时表而不是在我的测试用例中未显示此行为的子查询来解决此问题。

关于mysql - MySQL 中的 UPDATE ... WHERE 事务是否会锁定从子查询引用的其他表中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37328692/

相关文章:

MySQL Innodb 索引困惑

php - 如何使用 PHP 连接 Google Cloud SQL 并检索数据?

sql - 更新为最新日期

mysql - 主键在 UPDATE 时物理上重新排序吗?

MySQL 高 CPU 使用率与 InnoDB

mysql - 使mysql数据库中的所有表都成为innoDb类型

mysql - rails 服务器错误? ( rails 3)

mysql - 如何连接具有多个条件的多个表

搜索电子邮件地址时 MySQL MATCH AGAINST

sql - 更新 Where、Order by 和 Limit 不起作用