異なるインデックスを更新してMySQLのデッドロックルーチンを解決する

異なるインデックスを更新してMySQLのデッドロックルーチンを解決する 2番目の声明

t3 を更新し、b = '' に設定します (b = "2" の場合)。 

整理するために、次の順序で 3 つの X ロックが追加されました。

前回の記事では、ソース コードを使用してロック関連の情報をデバッグする方法を紹介しました。ここでは、このツールを使用して、実際のオンライン デッドロックのケースを解決します。これは、デッドロックの原因となった最初の 2 つの SQL ステートメントでもあります。オンラインテーブル構造は比較的複雑なので、以下のように簡略化されています。

テーブル `t3` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `a` varchar(5)、
 `b` varchar(5)、
 主キー (`id`)、
 ユニークキー `uk_a` (`a`)、
 キー `idx_b` (`b`) 
)
`t3` (`id`, `a`, `b`) 値に挿入 
 (1,'1','2');
# SQL 文は次の通りです。# トランザクション 1: t1
t3 を更新し、b = '' を設定します (a = "1" です)。

# トランザクション2: t2
t3 を更新し、b = '' に設定します (b = "2" の場合)。


2 つのステートメントがデッドロックを引き起こす状況を手動で再現するのは困難です。まずはロックのプロセスを分析してみましょう。

最初のステートメント(一意のインデックスを通じてレコードを更新する)

t3 を更新し、b = '' を設定します (a = "1" です)。 

完了後、次の順序で 3 つの X ロックが追加されました。

シリアルナンバー索引ロックタイプ
1イギリスバツ
2主要なバツ
3 idx_bバツ

シリアルナンバー索引ロックタイプ
1 idx_bバツ
2主要なバツ
3 idx_bバツ

2 つのステートメントは、ロックの順序から見てデッドロックの条件を満たしているようです。

手動でシミュレーションするのは困難です。2つのSQL文を同時に実行するコードを記述すると、すぐにデッドロックが発生します。

------------------------
最近検出されたデッドロック
------------------------
181102 12:45:05
*** (1)取引:
トランザクション 50AF、アクティブ 0 秒開始インデックス読み取り
使用中の MySQL テーブル 1、ロックされているテーブル 1
LOCK WAIT 3 つのロック構造体、ヒープ サイズ 376、2 つの行ロック
MySQL スレッド ID 34、OS スレッド ハンドル 0x70000d842000、クエリ ID 549 localhost 127.0.0.1 root 更新の行を検索しています
t3 を更新し、b = '' を設定します。ここで、b = "2" です。
*** (1) このロックが許可されるのを待機しています:
レコード ロック スペース ID 67 ページ番号 3 n ビット 72 インデックス `PRIMARY`、テーブル `d1`.`t3` trx ID 50AF lock_mode X はレコードをロックしますが、ギャップ待機はロックしません
レコード ロック、ヒープ番号 2 物理レコード: n_fields 5、コンパクト フォーマット、情報ビット 0
 0: 長さ 4; 16 進数 80000001; 昇順 ;;
 1: 長さ 6; 16 進数 0000000050ae; asc P ;;
 2: 長さ 7; 16 進数 03000001341003; 昇順 4;;
 3: 長さ 1; 16 進数 31; 昇順 1;;
 4: 長さ 0; 16進数; 昇順;;

*** (2)取引:
トランザクション 50AE、アクティブ 0 秒更新または削除
使用中の MySQL テーブル 1、ロックされているテーブル 1
4 つのロック構造体、ヒープ サイズ 1248、3 つの行ロック、UNDO ログ エントリ 1
MySQL スレッド ID 35、OS スレッド ハンドル 0x70000d885000、クエリ ID 548 localhost 127.0.0.1 root 更新中
t3 を更新し、b = '' を設定します。ここで、a = "1" です。
*** (2) ロックを保持する:
レコード ロック スペース ID 67 ページ番号 3 n ビット 72 インデックス `PRIMARY` テーブル `d1`.`t3` trx ID 50AE lock_mode X はレコードをロックしますが、ギャップはロックしません
レコード ロック、ヒープ番号 2 物理レコード: n_fields 5、コンパクト フォーマット、情報ビット 0
 0: 長さ 4; 16 進数 80000001; 昇順 ;;
 1: 長さ 6; 16 進数 0000000050ae; asc P ;;
 2: 長さ 7; 16 進数 03000001341003; 昇順 4;;
 3: 長さ 1; 16 進数 31; 昇順 1;;
 4: 長さ 0; 16進数; 昇順;;

*** (2) このロックが許可されるのを待機しています:
レコード ロック スペース ID 67 ページ番号 5 n ビット 72 テーブル `d1`.`t3` のインデックス `idx_b` trx ID 50AE lock_mode X はレコードをロックしますが、ギャップ待機はロックしません
レコード ロック、ヒープ番号 2 物理レコード: n_fields 2; コンパクト フォーマット; 情報ビット 0
 0: 長さ 1; 16 進数 32; 昇順 2;;
 1: 長さ 4; 16 進数 80000001; 昇順 ;;

*** トランザクションをロールバックします (1)

デッドロックログを分析する

*** (1) このロックが許可されるのを待機しています:
レコード ロック スペース ID 67 ページ番号 3 n ビット 72 インデックス PRIMARY テーブル d1.t3 trx ID 50AF lock_mode X はレコードをロックしますが、ギャップ待機はロックしません

トランザクション2: 主キーインデックスのXロックを取得する

*** (2) ロックを保持する:
レコード ロック スペース ID 67 ページ番号 3 n ビット 72 インデックス PRIMARY テーブル d1.t3 trx ID 50AE lock_mode X はレコードをロックしますが、ギャップはロックしません

トランザクション1: 主キーインデックスにXロックを保持する

*** (2) このロックが許可されるのを待機しています:
レコード ロック スペース ID 67 ページ番号 5 n ビット 72 テーブル d1.t3 のインデックス idx_b trx ID 50AE lock_mode X はレコードをロックしますが、ギャップ待機はロックしません

トランザクション1: 共通インデックスidx_bのXロックを取得したい

これは、当社の分析およびオンラインデッドロックログとまったく同じです。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ユニークインデックスの S ロックと X ロックによる MySQL デッドロック ルーチンの理解
  • MySQL デッドロック シナリオ例の分析
  • MySQL (InnoDB) がデッドロックを処理する方法の詳細な説明
  • MySQL における楽観的ロックと悲観的ロックの例
  • Mysqlは実行中のトランザクションを照会し、ロックを待機する方法
  • MySQLの関連ロックについての簡単な理解

<<:  Nginx でバージョン番号を隠したり偽造したりする方法

>>:  トークンの有効期限が切れたときにページを更新するときに繰り返しプロンプトが表示されないようにする Vue について

推薦する

Windows 10 での MySQL 8.0.12 解凍バージョンのインストール グラフィック チュートリアル

この記事は、MySQL 8.0.12解凍版のインストールグラフィックチュートリアルを記録しています。...

Datagrip2020 が MySQL ドライバーのダウンロードに失敗する

「downloadlaod」を直接クリックしてもダウンロードできない場合は、ここからダウンロードす...

js での遅延読み込みとプリロードの具体的な使用法

遅延読み込み(レイジー読み込み)とプリロードは、Web 最適化によく使用される手段です。 。 1. ...

CSS でより美しいリンクプロンプト効果をカスタマイズする方法

提案: コードをできるだけ手書きすると、学習の効率と深さを効果的に向上できます。デフォルトでは、&l...

Linux nlコマンドの使い方

1. コマンドの紹介nl (行数) は指定されたファイルに行番号を追加し、標準出力に書き込みます。フ...

nginx を介して方向プロキシを実装するプロセスの図

この記事は主に、nginx を介して方向プロキシを実装するプロセスを紹介します。この記事のサンプル ...

ウェブ標準学習リソースの素晴らしいコレクション

これらの仕様は、下位互換性のあるドキュメントを Web 上で公開し、できるだけ幅広いユーザーがアクセ...

ウェブデザインでよくある間違いのまとめ

Web ページを設計する過程で、デザイナーが間違いを犯すのは必然です。特に新人は、新しいアイデアを実...

CentOS7 での PostgreSQL 11 の詳細なインストールと設定のチュートリアル

1. 公式ウェブサイトアドレス公式サイトではインストールの参考手順が紹介されています。公式サイトを見...

MySql でデータの重複挿入を回避する 3 つの方法

序文MySql で主キーの競合または一意キーの競合が発生した場合、挿入方法に応じてエラーを回避するた...

HTML フレームセットのサンプルコード

この記事では、Frameset が作成した、できるだけシンプルなフレームワークを紹介します。さて、ま...

MySQL 8.0.23 のインストールと設定方法のグラフィックチュートリアル (Win10 の場合)

この記事では、MySQL 8.0.23のインストールと設定方法を参考までに紹介します。具体的な内容は...

HTMLのposition属性の使い方(4種類)の詳しい説明

位置の 4 つのプロパティ値は次のとおりです。 1.相対的な2.絶対3.修正4.静的これら 4 つの...

初心者がHTMLタグを学ぶ(3)

HTML に触れる初心者は、いくつかの HTML タグを学びます。関連記事:初心者が学ぶ HTML...