在 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/