2

次のようなサブクエリを含む (InnoDB と REPEATABLE READ 分離レベルを使用して) MySQL で 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 に答える