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 | 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 を応援していただければ幸いです。
<<: Nginx でバージョン番号を隠したり偽造したりする方法
>>: トークンの有効期限が切れたときにページを更新するときに繰り返しプロンプトが表示されないようにする Vue について
負荷リクエスト成功リクエストに失敗しました cmdをクリックし、ファイルパスでEnterキーを押しま...
W3C では、さまざまなタグの規定を設定するだけでなく、Web ページの作成者が実際に W3C 規...
<br />統計によると、Web ページの平均サイズは 2003 年以降 3 倍に増加し...
目次背景成し遂げる1. カプセル化された /utils/dialogControl.js 2.ダイア...
この方法は、CSS3のdrop-shadow filterを使用して、png画像の不透明部分に任意の...
導入された HTML タグは、必ずしも XHTML 仕様に完全に準拠しているわけではありません。実際...
この記事では、Mysql WorkBenchのインストールと設定のグラフィックチュートリアルを参考ま...
目次1. イベントとは何ですか? 2. イベントの使い方3. バインドタップとキャッチタップの違い4...
CSS スタイル html,本文{ 幅: 100%; 高さ: 100%; マージン: 0;パディング...
バックエンド管理システムで作業している場合、通常、メニュー権限制御に関連する問題に遭遇します。もちろ...
Mysqlはブール型を設定します1. Tinyintタイプテストテーブルを作成し、blフィールドをブ...
1. pc-reset PCスタイルの初期化 /* 正規化.css */ html{ 行の高さ: 1...
目次1. 関数とメソッドの違い2. 良い関数の書き方2.1 正確な命名2.1.1 関数の命名2.1....
数日前、Server2019の正式版がリリースされたことを知り、面白半分でインストールしてみることに...
目次1. 環境設定1.NTPサーバー2. ビジネスサーバー2. NTPサーバーの設定1. chron...