「初心者向けソースコードからの MySQL デッドロック問題の理解」では、MySQL ソースコードをデバッグしてデッドロックを確認するプロセスを紹介しました。この記事では、一般的なケースについて説明します。 簡単な例を見てみましょう # データの構築 CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `名前` varchar(10), `レベル` int(11)、 主キー (`id`)、 ユニークキー `uk_name` (`name`) ); `t1` (`name`, `level`) に VALUES ('A',0) を挿入します。 # 問題のある SQL ステートメントは次のとおりです。同時実行時にデッドロックが発生します。INSERT ignore INTO `t1` (`name`, `level`) VALUES ('A',0); t1 を更新し、level = 1 を設定します。name = "A" です。 前に紹介したソースコード分析方法を使用して、まずこれら 2 つのステートメントにどのようなロックが追加されているかを確認し、次にデッドロックの形成プロセスを分析します。 最初の声明 INSERT ignore INTO t1 (名前、レベル) VALUES ('A',0); デバッグ中に得られた結果は次のとおりです。 このステートメントにより、一意のキー uk_name に共有ロック (S ロック) が追加され、成功していることがわかります。 2番目の声明 t1 を更新し、level = 1 を設定します。name = "A" です。 一意のキーによってデータベース フィールドを更新します。 この状況は前回の記事で紹介しました。ユニーク インデックスに X ロックが追加され、次に主キー インデックスに X ロックが追加されます。 この方法では、デッドロックの問題を非常に簡単に再現できます。手順は次のとおりです。 1. 2つのセッションを開き、開始する 詳細なロックステータスの変更は次のとおりです。
デッドロックログは次のとおりです。 最近検出されたデッドロック ------------------------ 181208 23:00:52 *** (1)取引: トランザクション 53A7、アクティブ 162 秒 開始インデックス読み取り 使用中の MySQL テーブル 1、ロックされているテーブル 1 LOCK WAIT 3 つのロック構造体、ヒープ サイズ 376、2 つの行ロック MySQL スレッド ID 12、OS スレッド ハンドル 0x700010522000、クエリ ID 1424 localhost root 更新中 t1 を更新し、レベルを 1 に設定し、名前を "A" にします。 *** (1) このロックが許可されるのを待機しています: レコード ロック スペース ID 89 ページ番号 4 n ビット 72 テーブル `lock_demo2`.`t1` のインデックス `uk_name` trx ID 53A7 lock_mode X はレコードをロックしますが、ギャップ待機はロックしません レコード ロック、ヒープ番号 2 物理レコード: n_fields 2; コンパクト フォーマット; 情報ビット 0 0: 長さ 1; 16 進数 41; 昇順 A;; 1: 長さ 4; 16 進数 80000001; 昇順 ;; *** (2)取引: トランザクション 53A8、アクティブ 8 秒開始インデックス読み取り 使用中の MySQL テーブル 1、ロックされているテーブル 1 3 つのロック構造体、ヒープ サイズ 376、2 つの行ロック MySQL スレッド ID 96、OS スレッド ハンドル 0x70001062e000、クエリ ID 1425 localhost root 更新中 t1 を更新し、レベルを 1 に設定し、名前を "A" にします。 *** (2) ロックを保持する: レコード ロック スペース ID 89 ページ番号 4 n ビット 72 テーブル `lock_demo2`.`t1` のインデックス `uk_name` トランザクション ID 53A8 ロック モード S レコード ロック、ヒープ番号 2 物理レコード: n_fields 2; コンパクト フォーマット; 情報ビット 0 0: 長さ 1; 16 進数 41; 昇順 A;; 1: 長さ 4; 16 進数 80000001; 昇順 ;; *** (2) このロックが許可されるのを待機しています: レコード ロック スペース ID 89 ページ番号 4 n ビット 72 テーブル `lock_demo2`.`t1` のインデックス `uk_name` trx ID 53A8 lock_mode X はレコードをロックしますが、ギャップ待機はロックしません レコード ロック、ヒープ番号 2 物理レコード: n_fields 2; コンパクト フォーマット; 情報ビット 0 0: 長さ 1; 16 進数 41; 昇順 A;; 1: 長さ 4; 16 進数 80000001; 昇順 ;; *** トランザクションをロールバックします (2) このデッドロックログを詳しく見てみましょう *** (1) このロックが許可されるのを待機しています: レコード ロック スペース ID 89 ページ番号 4 n ビット 72 インデックス uk_name of table lock_demo2.t1 trx ID 53A7 lock_mode X はレコードをロックしますが、ギャップ待機はロックしません トランザクション1は、ユニークインデックスuk_nameのXロック(非ギャップロックレコードロック)を取得したい。 *** (2) ロックを保持する: レコード ロック スペース ID 89 ページ番号 4 n ビット 72 インデックス uk_name of table lock_demo2.t1 trx ID 53A8 ロック モード S トランザクション2は、ユニークインデックスuk_nameにSロック(共有ロック)を保持します。 *** (2) このロックが許可されるのを待機しています: レコード ロック スペース ID 89 ページ番号 4 n ビット 72 インデックス uk_name of table lock_demo2.t1 trx ID 53A8 lock_mode X はレコードをロックしますが、ギャップ待機はロックしません トランザクション 2 は、uk_name 一意インデックスの X ロック (非ギャップ ロック レコード ロック) を取得しようとしています。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Zabbix を使用して Nginx/Tomcat/MySQL を監視する方法の詳細なチュートリアル
>>: vuex の補助関数 mapGetters の基本的な使い方の詳細な説明
目次序文1. プロジェクトアーキテクチャ2. Echart公式サイトにアクセスして自己分析を学ぶ2....
1. ビッグデータとHadoopビッグデータについて研究し学ぶには、当然 Hadoop から始める必...
効果:スライドショーが一方向に動く場合、各画像のサイズ、位置、透明度、レベルを変更する必要があります...
setinterval を使用すると、ページを開いた直後に 1 秒の遅延後に実行されることがわかりま...
目次nginxとは1. 必要な依存関係をダウンロードする2. nginxの圧縮パッケージをダウンロー...
準備する1. 必要なインストールパッケージをダウンロードするhttps://www.php.net/...
この記事では、大画面スクロール効果を実現するためのjQueryの具体的なコードを参考までに紹介します...
この記事では、Fedora 28 に i3 をインストールして簡単に設定する方法を説明します。 1....
この記事では、キャンバスとjsを使用して簡単な飛行機戦争を実装する方法を参考までに紹介します。具体的...
コードをコピーコードは次のとおりです。 html、アドレス、引用ブロック、本文、dd、div、 dl...
目次SQLを理解するSELECTを理解するエイリアス定数をクエリし、固定定数列を追加します。重複行を...
Docker が今日非常に人気がある理由は、主にその軽量性、迅速な展開、およびリソースの利用にありま...
目次1. gojsの紹介2. Gojsのアプリケーションシナリオ3. gojs を選ぶ理由: 4. ...
1. 需要正しい Cookie 配信と SSO テストを確実に実行できるように、ローカル テスト ド...
目次1. 計画タスクをカスタマイズする2. 時間を同期する3. 練習する4. セキュリティの問題1....