この記事は主にInnoDBのロックに関する知識を素早く理解してもらうことを目的としています。 RocketMQの基本概念分析と詳細なソースコード分析 http://xiazai.jb51.net/202105/yuanma/RocketMQ_jb51.rar なぜロックする必要があるのかまず、なぜロックするのでしょうか?これ以上言う必要はないと思います。次のシーンを想像するだけでわかると思います。 ショッピングモールのトイレに行くとき、あなたはどうしますか?ドアをロックしてください。ドアをロックせずにトイレ使用中に突然ドアが開いたら、少し不適切と思われるかもしれません。 データについても同じことが言えます。同時実行シナリオでは、データがロックされていない場合、データの一貫性が直接破壊され、金銭が絡むビジネスの場合は、結果はさらに深刻になります。 ドアをロックする表現パックロックの分類InnoDB のロックとは何ですか?実際、すでに多くのことを知っているはずです。たとえば、面接では、ストレージ エンジン MyISAM と InnoDB の違いについて質問されます。MyIASM にはテーブル ロックしかありませんが、InnoDB は行ロックとテーブル ロックの両方をサポートしていると答えるでしょう。楽観的ロックと悲観的ロックの違いは何かと尋ねられることもあります。 ロックには多くの概念や名詞があります。ロックについての完全な世界観を持っていなければ、理解するのは難しいでしょう。次に、これらのロックを分類します。 ロックの粒度に応じてロックの粒度に応じて、次のように分類できます。
ページ ロックは BDB (BerkeleyDB) ストレージ エンジンにのみ存在する概念であるため、ここではページ ロックについては説明しません。ここでは主に InnoDB ストレージ エンジンについて説明します。 ロックのアイデアによるとロックの考え方に応じて、次のように分けることができます。
ここでの悲観主義と楽観主義は、あなたが普段理解している名詞と同じ意味を持ちます。楽観的ロックでは、競合が発生する可能性が低いと想定し、必要な場合にのみロックを実行します。悲観的ロックでは、競合が発生する可能性が高いと判断されるため、必要かどうかに関係なくロック操作が実行されます。 相性に応じて互換性に応じて、ロックは次のように分類できます。
共有ロックを持つリソースは他のユーザーと共有できますが、排他ロックが追加されると、他のユーザーはロックを取得せずに操作を実行できなくなります。 ロックの実装に応じてここでの実装は、InnoDB の特定の種類のロックです。
このように分類されているとはいえ、錠前の名前がたくさんあると、少し混乱してしまうかもしれません。たとえば、 現象を通して本質を見なければなりません。本質とは何でしょうか?本質は、ロックがどのオブジェクトに追加されるかであり、これには簡単に答えることができます。
行に追加されたロックの性質は何ですか?本質は、インデックスにロックを追加することです。 意図ロックInnoDB は、行ロックやテーブルロックなど、さまざまな粒度のロックをサポートしています。たとえば、 インテンション ロックは、次のトランザクションで使用されるロックの種類を示すテーブル レベルのロックです。次の 2 つの種類があります。
たとえば、
次の図は、これらのロックの組み合わせの排他性と互換性を示しています。 上記の表によれば、互いに互換性がある場合、対応するトランザクションはロックを取得できますが、互換性がない場合、互換性のないロックが解除されるまでロックを取得できません。 インテンション ロックは 引き続き例を使用して、トランザクション A が学生テーブルの id = 100 の行に対して共有ロックを取得し、次にトランザクション B が学生テーブルに対して排他ロックを適用する必要があるとします。これら 2 つのロックは明らかに競合しており、同じ行に対するものです。 InnoDB は、A がこのロックを取得したことをどのようにして知る必要があるのでしょうか? B+ ツリー全体をトラバースしますか?いいえ、答えは意図ロックです。トランザクション B が書き込みテーブルに排他ロックを適用すると、InnoDB はトランザクション A がすでにテーブルに対して意図的な共有ロックを取得していることを検出します。これは、共有ロックによってすでにロックされているレコードが学生テーブルに存在することを示します。現時点ではブロックされます。 さらに、インテンション ロックは 図書館に行って本を探すときと同じように、本棚を一つ一つ探す必要はありません。サービスデスクに行って、コンピューターで検索するだけで、図書館にその本があるかどうかがわかります。 レコードロックこれはレコード ロックであり、行ロックの一種です。レコード ロックのロック オブジェクトは、そのデータ行に対応するインデックスです。インデックスについてよくわからない場合は、この記事をお読みください。 id = 1 の行を更新するトランザクションを開始するときに、そのトランザクションをすぐにコミットせずに、id = 1 の行を更新する別のトランザクションを開始すると、 X は排他ロックを表します。このことから、レコード ロックは実際には共有ロック モードと排他ロック モードに分けられることがわかります。 上記のテキストに表示される ギャップロックギャップ ロックの場合、ロックされたオブジェクトもインデックスになります。ギャップロックをよりよく理解するために、例を見てみましょう。 更新するには、年齢が 18 から 25 の間の学生名を選択します。 もう一つの例を挙げます。 SELECT * FROM student WHERE age = 10 FOR UPDATE; ここでの age は一意のインデックスではなく、単純な非クラスター化インデックスであることに注意してください。このとき、 ギャップ ロックは、パフォーマンスと同時実行性を考慮した MySQL の妥協策であり、 Repeatable Read (RR) でのみ使用できます。現在のトランザクションの分離レベルが Read Committed (RC) の場合、MySQL はギャップ ロックを無効にします。 先ほど言ったように、レコード ロックは共有ロックと排他ロックに分かれており、ギャップ ロックも実際には同じです。しかし、レコード ロックとは異なり、共有ギャップ ロックと排他ギャップ ロックは相互に排他的ではありません。何が起こっているのでしょうか? 現象を通して本質を見極める必要があります。ギャップロックの目的は何でしょうか? 他のトランザクションがギャップにデータを挿入するのを防ぐため共有ギャップ ロックと排他ギャップ ロックはこの目標において一貫しているため、同時に存在できます。 プロキーロックネクストキー ロックは、InnoDB における行ロックの実装の最後のタイプです。ネクストキー ロックは、実際にはレコード ロックとギャップ ロックの組み合わせです。つまり、隣接キー ロックは対応するインデックスにレコード ロックを追加し、さらに間隔をロックします。 ただし、すべての一時キー ロックがこのように動作するわけではありません。次の SQL の場合: SELECT * FROM 学生 WHERE id = 23; この場合、 10、20、30 という 3 つのインデックス データ項目があるとします。一時的なキーロックの場合、ロック可能な範囲は次のようになります。
InnoDB のデフォルトのトランザクション分離レベルは、繰り返し読み取り (RR) です。この場合、InnoDB は一時的なキー ロックを使用してファントム読み取りを防止します。 ファントム リードについて簡単に説明すると、トランザクション内で 2 つのクエリを実行します。最初のクエリは 5 つのデータ項目を返しますが、2 番目のクエリは 7 つのデータ項目を返します。これがファントム リードです。 これまでの多くのブログやインタビュー記事で、InnoDB の RR トランザクション分離レベルによってファントム リードを防止できることを学んだことがあるかもしれません。RR でファントム リードを防止する鍵となるのは、一時的なキー ロックです。 たとえば、学生テーブルにそれぞれ ID が 90 と 110 の 2 つの行があるとします。 SELECT * FROM student WHERE id > 100 FOR UPDATE; この SQL ステートメントを実行すると、InnoDB は間隔 (90, 110] と (110,∞) にギャップ ロックを追加し、 id=110 のインデックスにレコード ロックを追加します。このようにして、100 がまったく存在しない場合でも、他のトランザクションはこの間隔に新しいデータを追加できません。 意図ロックを挿入次は、 もう一度例を見てみましょう。現在、インデックス レコード 10 と 20 があるとします。トランザクション A と B は、それぞれインデックス値 14 と 16 のデータを挿入します。このとき、トランザクション A と B は挿入意図ロックを使用して、10 と 20 の間のギャップをロックします。挿入意図ロックを取得した後、14 と 16 の排他ロックを取得します。 この時点では、トランザクション A と B は異なる行を挿入するため、互いにブロックされることはありません。 自動増分ロック最後に、AUTO-INC ロックがあります。AUTO-INC ロックの本質は、非常に特殊なテーブル ロックです。トランザクション A が さて、以下のリンクから、基本概念の分析と RocketMQ の詳細なソースコード分析を含む MQ 学習教材を入手してください。継続的に更新されるため、この学習教材をお見逃しなく。 http://xiazai.jb51.net/202105/yuanma/RocketMQ_jb51.rar (必ず収集してください) 上記は、MySQL の関連ロックの詳細についての簡単な紹介です。MySQL ロックの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: ボタンのタイプが送信として指定されていません。ボタンをクリックしても、指定された URL にジャンプしません。
1. HTMLの概要htyper テキスト マークアップ言語 ハイパーテキスト マークアップ言語ハ...
MySQL を使用する場合、日付は通常、datetime や timestamp などの形式で保存さ...
これは、Web ページを Windows のスタート メニューなどのデスクトップ プログラムのように...
<br />関連記事: Web スキル: 複数の IE バージョンを共存させるソリューシ...
エンジン導入InnodbエンジンInnodb エンジンは、データベース ACID トランザクションを...
序文プログラミング言語には通常、さまざまな隠されたトリックが含まれており、これらのトリックを上手に使...
イメージをプルし、コンテナを作成してコンテナを実行するだけです。 docker run -d --r...
今日は、参考までに、jsを使用してカルーセルマップの効果を実現する方法についてお話ししましょう。具体...
マイクロサービスのイメージは、保存用に Docker リポジトリにアップロードされます。一般的に使用...
最近、たまたま vue+springboot のフロントエンドとバックエンドの分離プロジェクトに触れ...
コードをコピーコードは次のとおりです。 <!DOCTYPE html> <html...
ModSecurity は、Web サーバーに入るすべてのパケットをチェックする強力なパケット フィ...
MySQL データベースでは、あいまいクエリが必要な場合にワイルドカードを使用します。まず、演算子と...
1. 足場とは何ですか? 1. Vue CLI Vue CLI は、Vue.js をベースにした迅速...
この記事の例では、カスタムスクロールバーコンポーネントを実装するためのjsの具体的なコードを参考まで...