将更新..MySQL 中的 WHERE 事务锁定从子查询引用的其他表中的行



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

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确实会在此类查询期间获取共享锁。我已经使用子查询中的 SLEEP 语句和来自另一个会话的同时更新来验证这一点。

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

最新更新