2

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

4

1 回答 1

1

看起来 InnoDB确实 在此类查询期间获取共享锁。我已经使用子查询中的 SLEEP 语句和另一个会话的同时更新验证了这一点。

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

于 2016-05-20T18:30:54.217 回答