0

これは非常に単純な質問ですが、Google で役に立つ答えが見つかりません。

SELECTにREAD LOCK、UPDATEステートメントにWRITE LOCKがあることを読んでいます。ただし、テーブルに INSERT するときに何らかの種類の LOCK があるかどうかを調べようとしていますか?

テーブルがエンジンとして InnoDB を使用していることを前提としています。

4

3 に答える 3

4

挿入時に、InnoDB はいわゆる「ギャップ ロック」を作成します。

マニュアルはこれを非常によく説明しています

挿入意図ギャップ ロックと呼ばれるタイプのギャップ ロックは、行挿入の前に INSERT 操作によって設定されます。このロックは、同じインデックス ギャップに挿入する複数のトランザクションが、ギャップ内の同じ位置に挿入されていない場合、相互に待機する必要がないように、挿入する意図を通知します。4 と 7 の値を持つインデックス レコードがあるとします。5 と 6 の値を挿入しようとする個別のトランザクションは、挿入された行の排他ロックを取得する前に、挿入インテンション ロックを使用して 4 と 7 の間のギャップをそれぞれロックしますが、そうではありません。行が競合していないため、互いにブロックします

それに加えて、提供された値に対して一意のインデックスがロックされ、2 つの異なるトランザクションが同じ値を挿入しないようにします (間違いでなければ、ギャップ ロックとは少し異なります)。

于 2013-02-26T08:18:11.087 に答える
0

ギャップ ロックの説明に加えて、Mysql INNODB は挿入される行に対して ROW-LOCK を実行します。

于 2013-02-26T08:24:53.377 に答える
0

innoDB の場合、mysql は行レベルのロックを使用します。挿入するときに、ロックする行がありません。作成しているためです。

于 2013-02-26T08:09:20.413 に答える