デッドロックのために必要な条件を生成します
- 同時トランザクションの複数(2つ以上)の
- それぞれの物事がある(あるいはすでにロックを待っている)ロックを保持しています
- 各トランザクションは、(あなたも多くの行を更新する必要があり、トランザクションロジックを完了するために)ロックを保持し続ける必要があり
-
生成は、デッドロックを形成し、中でも待っロックループ
従来のロックモード
- LOCK_S(読み取りロック、共有ロック)
-
LOCK_X(書き込みロック、排他ロック)
ロック属性
- LOCK _REC_NOT_GAP(ロックレコード)
- LOCK_GAP(記録前GAPロック)
- LOCK_ORDINARY(+ GAPを同時に記録する前に記録をロックし、次のキーロック)
-
LOCK_INSERT_INTETION(意図的ロックを挿入します)
ロック組み合わせ(プロパティ+モード)
任意の組み合わせ
ロック競合行列
ロックがそこに追加されますか?
プライマリ検索キー-マスターキーに適用ロック
始めると、IDはtt_copy SELECT * FROM
ロックケーステーブルのインデックスPRIMARY
test
。tt_copy
RECはなくギャップTRX番号1101588のlock_modeにはXロック
通常、インデックス・ルックアップ-ロックは、共通の主キーインデックスにし、印加され
始めると、tt_copy力指数SELECT * FROM
ケースをロックテーブルのインデックスidx_a
test
。tt_copy
TRX番号1101590 lock_modeにはXロックRECなくギャップ
テーブルのインデックスPRIMARYtest
。tt_copy
RECはなくギャップTRX番号1101590のlock_modeにはXロック
制御動作ロックの関係
以下の特別な指示はRC分離レベルではありません
インサート
- 一意のキー、挿入:RR分離レベルまたはRCが主キーであるか否かをプラスLOCK_X + LOCK_REC_NOT_GAP
-
有ユニークキー
挿入の前に、唯一の制約チェック:LOCK_S + LOCK_ORDINARY
フロントインサートは、ロックGAP場所を挿入:LOCK_INSERT_INTETION
挿入した後、新しいデータが挿入されます。LOCK_X + LOCK_REC_NOT_GAP
削除
削除すべてのレコードが基準を満たす:LOCK_X + LOCK_REC_NOT_GAP
更新
更新操作分解
- ステップ1:に配置する次の照会基準を満たすレコード(セレクトに似たクエリ処理、/削除)
- ステップ2:見つけるために、現在のレコードを削除(消去状態のためにマークされています)
- ステップ3:、更新項目の組み立てに更新されたアイテムに応じて、新たな挿入位置
- ステップ4:新しい挿入位置では、それは競合が一意(存在するか否かを判定する存在するとき固有キー)
- ステップ5:挿入(紛争のユニーク不在)更新アイテム
- ステップ6:操作のステップ5にステップ1を繰り返し、完全な走査範囲クエリまで、
更新動作解析
- ステップ1、ステップ2:削除
- ステップ3、ステップ4、ステップ5:挿入
更新
-
无ユニークキー:
- クエリの範囲内のすべてのレコード、LOCK_X + LOCK_REC_NOT_GAP
-
有ユニークキー:
- LOCK_X + LOCK_REC_NOT_GAP、問い合わせの範囲内のすべてのレコード:レコードの条件を満たして下さい
- アイテムの競合ロック、:アイテムを更新した後、一意性競合が存在するLOCK_S + LOCK_ORDINARYを
- 位置更新後アイテムロック、LOCK_S + LOCK_GAP(省略):競合アイテム固有の更新が存在しません
- 実際の更新操作:インサートは、新しいレコード、LOCK_X + LOCK_REC_NOT_GAPとして見ることができます
GAPロック
これらの動作は、GAPロックを追加しますか?
- コミット読み取り(RC)):ユニークキーユニーク制約チェック、パージ操作;
- 反復可能読み取り(RC):すべてのインデックス範囲スキャンとインデックスに基づいてRCは、ルックアップをロックする必要があります(更新/削除...)
- 別のプラスGAPは、ロックされ:RR分離レベルの下では、インサートテーブルの実装が重複更新操作に一意のインデックスを持つ、新しく挿入されたレコードに加えて、Xいないギャップを追加するだけでなく、隣接する記録プラスXギャップに
GAPロックを取り除く方法は?
トランザクション分離レベルを変更COMMITTED READまたは有効innodb_locks_unsafe_for_binlogの(廃止された)システム変数を
ときは、ネクストキーロックを追加しますか?
デフォルトでは、InnoDBはで動作REPEATABLE READトランザクション分離レベル。この場合、InnoDBは使用ネクストキーロックするための検索および索引スキャンをファントム行を防止します、
意図ロックを挿入
インサート意図ロックによってギャップの種類を設定ロックであるINSERTの前(在...之前)行挿入する操作。
概要
•原則の一つ
- デッドロックを分析するために、我々は(ない密室の修理の後ろ)トランザクション全体のロジックを理解するために、より良いビジネスなければなりません
•2の原則 `
- GAPロックはGAPをデッドロックするリードを減らし、GAPのロックを削減するために、コミット分離レベルの読み取り(反復可能読み取りを使用せずに、すべての問題を解決する基本的に可能なのRC +行ベースのバイナリログを、)を選択しようとすると、非常に複雑です
- 減少させるのに適切な一意のインデックスは、(サービスの可用性に応じて)デッドロックGAPをロックすることにより低減することができます
•第3の原理
- MySQLでは、異なる指標が条件をフィルタリングするために、同様の操作を記録する(更新/削除)、簡単に死んで作成し
たロックを。
•第四原則
- RCの分離レベルの下で、次のキーは一意のインデックステーブルが存在しなければならないことを示す(ギャップロック)デッドロックを、表示された場合
- 生成された複数文のトランザクションをデッドロック、各ステートメントの操作記録の順序を確認して、大幅にデッドロックを減らすことができます
「 - 彼Dengcheng - 道路のジグソーパズルの一片--MySQL(InnoDBの)デッドロック分析デッドロック」のほとんどがこの記事を仕上げています