序文ある日、突然 MySQL の次のキー ロックについて尋ねられ、私の即座の反応は次のようなものでした。 これは一体何ですか? ? ? このスクリーンショットでは何も見えません。 よく見ると見覚えがあります。これは「MySQL 45 Lectures」の内容ではないでしょうか。 ネクストキーロックとは
公式サイトの説明は、大まかに言うと、次のキー ロックは、インデックス レコードに対するレコード ロックと、インデックス レコードの前のギャップに対するギャップ ロックの組み合わせである、ということです。 まず自分自身にたくさんの小さな疑問符を付けてみませんか? ? ?
何も分からないので、最初から練習しなくてはいけません! まず、Ding Qi 氏の「MySQL 45 Lectures」の結論を見てみましょう。 この結論を読めば、ほとんどの疑問は解決するはずですが、注意が必要な非常に重要な一文が1つあります。MySQL したがって、上記のルールは現在のバージョンには適用できない可能性があります。以下では、 環境の準備MySQL バージョン: 8.0.25 分離レベル: 繰り返し読み取り (RR) ストレージエンジン: InnoDB mysql> @@global.transaction_isolation、@@transaction_isolation\G を選択します。 mysql> テーブル t\G の作成を表示します Docker を使用して MySQL をインストールする方法については、別の記事「Docker を使用して MySQL をインストールして接続する」を参照してください。 主キーインデックスまず、主キーインデックスの次キーロックの範囲を確認しましょう。 このときのデータベースデータは図の通りです。主キーインデックスの場合、データギャップは以下のようになります。 主キーの等価値クエリ - データが存在する mysql> begin; select * from t where id = 10 for update; この SQL ステートメントは ロック情報は # mysql> performance_schema.data_locks から * を選択します。 mysql> performance_schema.data_locks\G から * を選択します 具体的なフィールドの意味については、公式ドキュメントを参照してください。 結果には主に、エンジン、ライブラリ、テーブルなどの情報が含まれます。次のフィールドに注目する必要があります。
結果は明らかです。ここでは、IX ロックがテーブルに追加され、主キー インデックス ID = 10 のレコードに 同様に、 結論として、次のことが言えます。 主キー値をロックし、その値が存在する場合、テーブルにインテンション ロックが追加され、主キー インデックスに行ロックが追加されます。 主キーの等価値クエリ - データが存在しませんmysql> id = 11 の場合、更新時に t から * を選択します。 データが存在しない場合は、どのようなロックが追加されますか?ロックの範囲は何ですか? 検証する前に、データのギャップを分析します。
data_locks を使用してロック情報を分析します。 ロック情報 このとき、別のセッションで SQL を実行すると、答えは明らかです。id = 12 は挿入できませんが、id = 15 は更新できます。 データが存在しない場合は、主キーの等価値クエリによって、主キー クエリ条件が配置されているギャップがロックされることがわかります。 主キー範囲クエリ(キーポイント)mysql> begin; select * from t where id >= 10 and id < 11 for update; 「MySQL 45 Lectures」の分析によると、次のような結果が得られました。
data_locks の初見 テーブル ロックに加えて、id = 10 の行ロック ( したがって、実際には id = 15 を更新できます。つまり、 結果の検証も正しく、id = 12 は挿入がブロックされ、id = 15 は正常に更新されます。 範囲の右側に等しい値のクエリが含まれている場合はどうなりますか? mysql> begin; select * from t where id > 10 and id <= 15 for update; この SQL を分析してみましょう: また、data_locksもご覧ください 主キー インデックス id = 15 に対して X ロックが 1 つだけ追加されていることがわかります。 id = 15 が更新できることを確認しますか? id = 16 を挿入できるかどうかを再度確認しますか? 問題はないことがわかりました! もちろん、ここにいる友人の中には、「MySQL 45 Lectures」に次のキーをロックするバグがあると言う人もいるでしょう。 このバグは修正されたようです。修正されたバージョンは 参考リンクアドレス: 8.0 リリースノート 検索キーワード: バグ #29508068) それぞれ 8.0.17 で再現できます: 8.0.17 では、
現在、 data_locks データを比較します。 赤い下線部分に注意してください。バージョン 8.0.17 では、 要約するこの記事では、主に主キーをロックする際の次キーのロック範囲を実際の操作を通じて検証し、資料を参照したりバージョンを比較したりしてさまざまな結論を導き出します。 結論1:
最適化後、遅く開きます。これは、最適化後、主キーの間隔が直接遅く開くためなのか、バグなのかはわかりません。特定の友達が試すことができます。 結論2
主キーの次キーロック範囲は大体把握できました。なお、使用バージョンは 8.0.25 です。 疑い
この記事の長さは限られているので、まずは自分で考えて、自分で試してみるといいでしょう。練習すれば完璧になります。具体的な答えについては、次の記事で検証し、結論をまとめる必要があるでしょう。 これで、MySQL の next-key lock のロック範囲に関するこの記事は終了です。MySQL の next-key lock のロック範囲の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: CSS3 で z-index が効かない問題の解決方法
>>: Flinkのフォールトトレラントメカニズムに関する簡単な説明:ジョブ実行とデーモン
まず、どのフィールドまたはフィールドの組み合わせがデータ行を一意に識別できるかを決定する必要がありま...
MySQL バージョン 5.0 ではストアド プロシージャのサポートが開始されました。ストアド プロ...
先ほど MySQL パスワードを設定したのに、外食したり荷物を受け取ったりするときにパスワードを忘れ...
リンクインスタイルとは、すべてのスタイルを 1 つ以上の外部スタイルシート ファイルに配置することで...
Tomcatが同時リクエストを処理する方法を理解することで、スレッドプール、ロック、キュー、および...
目次1. Consulクラスタをデプロイする1. 準備3. Consulクラスタを作成する4. 管理...
序文<router-link> タグは、Vue アプリ内のさまざまなページ間を移動するた...
1つ目: テキスト/HTML経由var txt1="<h1>テキスト。<...
目次1. JavaScriptで配列を作成する方法2. 配列メソッドの概要3. 方法の詳細な説明1....
Elasticsearchは現在非常に人気があり、多くの企業が利用しているため、esを知らないと軽蔑...
ElementUIページングコンポーネントPagination in Vueの使用は参考になります。...
背景アジャイル モデルは広く使用されており、テストは特に重要です。新しいバージョンは頻繁にリリースす...
この記事では、例を使用して、Mysql データベースの基本的な SQL ステートメントについて説明し...
はじめに: MySQL を使用してテーブルを作成する場合、通常は自動インクリメント フィールド (A...
目次レンダリングAPIの変更レンダリング関数のパラメータレンダリング関数のシグネチャの変更VNode...