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

时间:2016-05-19 16:09:05

标签: mysql sql-update innodb database-locking

在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而不是子查询有什么区别吗?

1 个答案:

答案 0 :(得分:1)

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

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