夜遅くまで何度も困難なシングルステップデバッグを行った後、ようやく理想的なブレークポイントを見つけました。ロック取得プロセスコードの大部分は、 シナリオ 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: JavaScript 配列の Reduce() メソッドの構文と例の分析
>>: JavaScript を使用して文字列内の最も繰り返しの多い文字を取得する方法
1. 互換性以下のように表示されます。 互換性は問題ありません。IE を除き、他のブラウザは基本的に...
CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する 7 つの方法。コー...
需要: この需要は緊急に必要です!地下鉄のシーンでは、脱出経路を示す矢印を描かなければなりません。こ...
目次概要フレームワークを選択する理由は何ですか? js のエンバーEmber.js と Vue.js...
1. 「stripslashes($_POST['json']);」メソッドを使用し...
HTML についてどれくらい知っていますか? 現在、基本的な HTML コードを学習している場合は、...
ユーザーのホーム ディレクトリがどんどん大きくなってきたら、ホーム ディレクトリを新しいパーティショ...
MySQL を学習すると、インストール後にいくつかのデフォルトのデータベースが付属していることに気付...
1. Tclスクリプトファイルcircle.tclコードコメント #シミュレーションに必要なプロパテ...
nginx.conf を構成するときには常に何らかの問題が発生します。ここでは、よくある問題とその解...
Nginx グローバル変数Nginx には、$variable 名を通じて使用できるグローバル変数が...
1. 基本的な使い方これは MutationObserver コンストラクターを通じてインスタンス化...
jdk をインストールします: Oracle 公式ダウンロード https://www.oracl...
序文最近、弊社のサーバーがハッカーの攻撃を受け、一部のファイルの属性が変更されたため、ウイルスファイ...
<TH> タグは、テーブル内のヘッダーのプロパティを設定するために使用されます。以下の...