16

このマルチアップデートクエリがある場合

UPDATE user u
INNER JOIN user_profile up ON up.user_id = u.id
SET u.name = 'same_name_i_already_had', up.profile.age = 25
WHERE u.id = 10

user テーブルの行 10 には既に「same_name_i_already_had」という名前が付けられているため、更新しないでください。

一方、user_profile テーブルの行は年齢が異なるため、MySQL はそれを更新する必要があります。MySQLを RDBMS として、行レベルのロック システムを両方のテーブルのエンジンとして使用するInnoDB

を 想定すると、MySQL はその行の名前フィールドを更新する必要がないにもかかわらず、ユーザー テーブルの行をロックしますか?

4

2 に答える 2

13

行をロックしuserます。これは、優れたinnotopツールを使用して確認できます。

  • innotop を実行し、「L」キーを押して、InnoDB ロックの画面を表示します。
  • 別のセッションを開き、MySQL にログインして START TRANSACTION を実行します。
  • 表示された UPDATE を実行しますが、まだコミットしないでください。
  • innotop 画面でロックを表示します。

たとえば、MySQL 5.5 を実行しているテスト VM にテーブル user と user_profile を作成し、上記の手順を実行しました。出力は次のとおりです。

[RO] Locks (? for help) localhost, 08:34.568, InnoDB 10s :-), 0.10 QPS, 2/0/0 con/run/cac thds, 5.5.

__________________________________________ InnoDB Locks __________________________________________
ID  Type    Waiting  Wait   Active  Mode  DB    Table         Index    Ins Intent  Special        
 2  TABLE         0  00:00   02:35  IX    test  user                            0                 
 2  RECORD        0  00:00   02:35  X     test  user          PRIMARY           0  rec but not gap
 2  TABLE         0  00:00   02:35  IX    test  user_profile                    0                 
 2  RECORD        0  00:00   02:35  X     test  user_profile  PRIMARY           0  rec but not gap
于 2011-06-29T18:46:38.717 に答える
4

関係なく、ほぼ確実に行をロックします。最初に変更がチェックされる単純なフィールドを知りません。ロック、書き込み、ロック解除を行う方が簡単で高速です。ロックする前にチェックがあった場合は、競合状態があります。ロックが完全に回避するものです。

于 2011-06-29T18:35:33.483 に答える