初心者がソースコードからMySQLのデッドロック問題を理解する

初心者がソースコードからMySQLのデッドロック問題を理解する

夜遅くまで何度も困難なシングルステップデバッグを行った後、ようやく理想的なブレークポイントを見つけました。ロック取得プロセスコードの大部分は、 lock0lock.cstatic enum db_err lock_rec_lock()関数にあることがわかります。この関数は、ロック取得のプロセスと、ロック取得が成功したかどうかを表示します。

シナリオ 1: 主キーによる削除

テーブル構造

テーブル `t1` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) NOT NULL デフォルト ''
 主キー (`id`)
)ENGINE=InnoDB;

id = 10 の t1 から削除します。

ご覧のとおり、インデックス PRIMARY はロックされており、モードは 1027 です。1027 はどういう意味でしょうか? 1027 = LOCK_REC_NOT_GAP + LOCK_X (非ギャップレコードロックとXロック)

プロセスは以下のとおりです

結論:主キー ID に基づいて他のインデックスを使用せずにデータを削除するには、この SQL ステートメントで、ID = 10 のレコードの主キー インデックスに X ロックを追加するだけで済みます。

シナリオ 2: 一意のインデックスによる削除

テーブル構造が若干調整され、名前の一意のインデックスが追加されました。

データを構築する CREATE TABLE `t2` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) NOT NULL デフォルト ''
 主キー (`id`)、
 ユニークキー `uk_name` (`name`)
) ;
`t2` (`id`, `name`) 値に挿入 
 (1,'M')、
 (2、'Y')、
 (3、'S')、
 (4,'Q')、
 (5、'L');
 
テスト SQL ステートメント delete from t2 where name = "Y"

実際のソースコードのデバッグ結果を見てみましょう

最初のステップ:

ステップ2:

結論:このプロセスでは、まずユニークキーuk_nameにXロックを追加し、次にクラスター化インデックス(主キーインデックス)にXロックを追加します。

プロセスは以下のとおりです

シナリオ3: 通常のインデックスによる削除

データを構築する CREATE TABLE `t3` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) NOT NULL デフォルト ''
 主キー (`id`)、
 キー `idx_name` (`name`) 
);
`t3` (`id`, `name`) 値に挿入 
 (1,'N')、
 (2、'G')、
 (3、「私」)、
 (4,'N')、
 (5、'X');
 
テストステートメント:
name = "N" の場合、t3 から削除します。

デバッグのプロセスを図に示します。

結論:共通インデックスを介して更新する場合、条件を満たすすべての共通インデックスに X ロックが追加され、関連する主キー インデックスに X ロックが追加されます。

プロセスは以下のとおりです

シナリオ4: インデックスを使用せずに削除する

テーブル `t4` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) NOT NULL デフォルト ''
 主キー (`id`)
)

`t4` (`id`, `name`) 値に挿入 
 (1,'M')、
 (2、'Y')、
 (3、'S')、
 (4,'Q')、
 (5、'L');
 
name = "S" の場合、t4 から削除します。

Xロックは全部で5つあり、残りの3つは1つずつリストされていません。

結論:インデックスを使用せずに更新する場合、SQL はクラスター化インデックス (主キー インデックス) を使用してテーブル全体をスキャンするため、条件を満たしているかどうかに関係なく、各レコードがロックされます。まだ終わってないよ…

ただし、効率化のため、MySQL では最適化が行われています。条件を満たさないレコードについては、判断後にロックが解除されます。最終的に保持されるロックは条件を満たしたレコードに対するものですが、条件を満たさないレコードに対するロック/解除アクションは省略されません。

プロセスは以下のとおりです

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

以下もご興味があるかもしれません:
  • MySQL デッドロック問題の分析と解決例
  • Mysql は、デッドロック問題を解決するために kill コマンドを使用します (実行中の特定の SQL ステートメントを強制終了します)。
  • MySQL の redo デッドロック問題のトラブルシューティングと解決プロセス分析
  • MySQL データベースのパージデッドロック問題の分析
  • MySQLデッドロック問題の詳細な分析

<<:  JavaScript 配列の Reduce() メソッドの構文と例の分析

>>:  JavaScript を使用して文字列内の最も繰り返しの多い文字を取得する方法

推薦する

CSS3のall属性の使い方を理解する

1. 互換性以下のように表示されます。 互換性は問題ありません。IE を除き、他のブラウザは基本的に...

CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する複数の方法

CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する 7 つの方法。コー...

three.js を使って立体的な矢印線を描く詳細な手順

需要: この需要は緊急に必要です!地下鉄のシーンでは、脱出経路を示す矢印を描かなければなりません。こ...

Ember.js と Vue.js の詳細な比較

目次概要フレームワークを選択する理由は何ですか? js のエンバーEmber.js と Vue.js...

PHP で JSON バックスラッシュを削除する例

1. 「stripslashes($_POST['json']);」メソッドを使用し...

HTML スペースコードの簡単な分析

HTML についてどれくらい知っていますか? 現在、基本的な HTML コードを学習している場合は、...

Ubuntu でホームディレクトリを新しいパーティションに移行する詳細なチュートリアル

ユーザーのホーム ディレクトリがどんどん大きくなってきたら、ホーム ディレクトリを新しいパーティショ...

MySQLインストール後のデフォルトデータベースの役割の詳細な説明

MySQL を学習すると、インストール後にいくつかのデフォルトのデータベースが付属していることに気付...

Tcl言語に基づくシンプルなネットワーク環境を構成するプロセスの分析

1. Tclスクリプトファイルcircle.tclコードコメント #シミュレーションに必要なプロパテ...

nginx.conf のルートディレクトリ設定の詳細な説明

nginx.conf を構成するときには常に何らかの問題が発生します。ここでは、よくある問題とその解...

Nginx のアクセス制御とパラメータ調整方法

Nginx グローバル変数Nginx には、$variable 名を通じて使用できるグローバル変数が...

JavaScript で DOM 要素を監視する MutationObServer の詳細

1. 基本的な使い方これは MutationObserver コンストラクターを通じてインスタンス化...

tomcat をインストールし、Linux で Web サイトを展開します (推奨)

jdk をインストールします: Oracle 公式ダウンロード https://www.oracl...

Linux で削除できないファイル/フォルダの解決方法

序文最近、弊社のサーバーがハッカーの攻撃を受け、一部のファイルの属性が変更されたため、ウイルスファイ...

HTML テーブル タグ チュートリアル (36): テーブル ヘッダーの背景色属性 BGCOLOR

<TH> タグは、テーブル内のヘッダーのプロパティを設定するために使用されます。以下の...