序文 「データベース トランザクションの特徴は何ですか?」と尋ねられたら、 ACID 特性である原子性、一貫性、独立性、永続性はすぐに答えられるでしょう。では、InnoDB がこれらのトランザクション特性をどのように保証するかをご存知ですか?ご存知の方はこの記事を読み飛ばしていただいても大丈夫です(#^.^#) まず結論を述べます。
再実行ログ REDO ログ REDO ログは 2 つの部分に分かれています。1 つはメモリ内の失われやすい REDO ログ バッファであり、もう 1 つは永続的な REDO ログ ファイルです。 InnoDB は、コミット時にログを強制するメカニズムを通じて永続性を実現します。コミット時には、永続性のためにすべてのトランザクション ログをまず REDO ログ ファイルに書き込む必要があり、コミット操作が完了した後にのみトランザクションが完了したとみなされます。 InnoDB は、次の状況で、REDO ログ バッファの内容を REDO ログ ファイルに書き込みます。
各ログが確実に REDO ログ ファイルに書き込まれるようにするには、ログ バッファーが REDO ログ ファイルに書き込まれるたびに、InnoDB ストレージ エンジンが fsync (フラッシュ) 操作を呼び出す必要があります。しかし、これは絶対的なものではありません。ユーザーは、innodb_flush_log_at_trx_commoit パラメータを変更することで、REDO ログをディスクにフラッシュする戦略を制御できます。このパラメータは、大量のトランザクションをコミットする際の最適化ポイントとして使用できます。
ロールバックログ取り消しログ トランザクションのアトミック性を保証するために、データを操作する前に、まずデータをある場所にバックアップし(データのバックアップが保存される場所は Undo ログと呼ばれます)、その後データを変更します。エラーが発生した場合、またはユーザーが ROLLBACK ステートメントを実行した場合、システムは Undo ログ内のバックアップを使用して、トランザクションが開始される前の状態にデータを復元できます。 UNDO ログは、トランザクションの分離を保証するために、マルチバージョン同時実行制御 (MVCC) を実装します。 ロールバック ログは、REDO ログとは異なります。これは、データベースへのすべての変更を論理的に取り消す論理ログです。トランザクションがロールバックされると、実際には以前に実行した処理の逆の処理が実行されます。各 INSERT に対して、InnoDB ストレージ エンジンは DELETE を実行し、各 UPDATE に対して、InnoDB ストレージ エンジンは逆 UPDATE を実行します。 トランザクションがコミットされた直後に UNDO ログを削除することはできません。これは、UNDO ログを使用して行レコードの以前のバージョンを取得する必要がある他のトランザクションが存在する可能性があるためです。ストーリー タスクが送信されると、元に戻すログがリンク リストに格納されます。元に戻すログを削除できるかどうかは、次の 2 つの状況によって異なります。
ロック トランザクション分離の実装原理はロックであるため、分離は同時実行制御、ロックなどとも呼ばれます。トランザクションの分離では、各読み取り/書き込みトランザクションのオブジェクトを他のトランザクションの操作オブジェクトから分離する必要があります。さらに、たとえば、バッファ プール内の LRU リストを操作する場合、LRU リスト内の要素を削除、追加、移動するときには、一貫性を確保するためにロックが必要になります。 ロックの種類 InnoDBには、行レベルロックと意図ロックという2つの主なロックタイプがあります。 行レベルのロック:
行レベルのロックのうち、S と S を除く他のすべてには互換性がありません。 意図ロック:
意図ロックを説明する
意図ロックの主な目的は、トランザクションがデータ行をロックしていること、またはロックする予定であることを表現することです。たとえば、トランザクション A がレコード r の行に X ロックを適用する場合、InnoDB は最初にテーブルに IX ロックを適用し、次にレコード r に X ロックを適用します。トランザクション A が完了する前に、トランザクション B は完全なテーブル操作を実行しようとします。このとき、テーブル レベルの IX は、テーブル内の各行にロックがあるかどうかを判断することなく、トランザクション B に直接待機するように指示します。意図的な排他ロックの価値は、InnoDB のロック配置と処理パフォーマンスを節約することにあります。また、意図ロックは完全なテーブルスキャンを除いてブロックされないことにも注意してください。 ロックアルゴリズム InnoDB には 3 つの行ロック アルゴリズムがあります。
ここでは主に Next-Key Lock について説明します。Next-key Lock は単一の値ではなく範囲をロックします。その目的は、複数のトランザクションが同じ範囲にレコードを挿入してファントム読み取りが発生するのを防ぐことです。 一意のインデックスが使用されている場合、次のキー ロックはレコード ロックにダウングレードされます。つまり、範囲ではなくインデックス自体のみがロックされます。つまり、Next-Key Lock の前提条件は、トランザクション分離レベルが RR であり、照会されたインデックスが非一意インデックスまたは主キー インデックスであることです。 例を使って詳しく説明しましょう。 まずテーブルを作成します。 テーブル T を作成します (id int、f_id int、主キー (id)、キー (f_id)) エンジン = InnoDB デフォルト文字セット = utf8 T SELECT 1,1 に挿入します。 T SELECT 3,1 に挿入します。 T SELECT 5,3 に挿入します。 T SELECT 7,6 に挿入します。 T SELECT 10,8 に挿入します。 トランザクション A は次のステートメントを実行します。 SELECT * FROM T WHERE f_id = 3 更新用 このとき、SQL ステートメントは一意でないインデックスを使用するため、Next-Key Locking が使用され、2 つのインデックスが存在するため、個別にロックする必要があります。 クラスター化インデックスの場合、ID が 5 のインデックスにのみレコード ロックが追加されます。補助インデックスの場合、範囲 (1,3) をロックするために Next-Key Lock が追加されます。InnoDB ストレージ エンジンは、補助インデックスの次のキー値にギャップ ロック、つまり範囲 (3.6) のロックも追加することに注意することが重要です。 したがって、新しいセッションで次のステートメントを実行すると、エラー select * from T where id = 5 lock in share MODE -- 実行できません。トランザクション A が id = 5 の値に X ロックを追加したため、実行がブロックされます。INSERT INTO T SELECT 4,2 -- 実行できません。補助インデックスの値は 2 で、範囲 (1,3) 内にあるため、実行がブロックされます。INSERT INTO T SELECT 6,5 -- 実行できません。ギャップ ロックによって範囲 (3,6) がロックされるため、実行がブロックされます。 ここで、トランザクション A が f_id = 5 のレコードをロックするとします。通常、(5, 6) をロックするギャップ ロックがあります。(5, 6) にギャップ ロックがない場合、ユーザーはインデックス f_id 5 のレコードを挿入できます。その後、トランザクション A は再度クエリを実行すると異なるレコードを返し、ファントム リードが発生します。 同様に、トランザクション A が 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
>>: CentOS での samba フォルダ共有サーバー構成の詳細な説明
この記事の例では、Bootstrap FileInputの具体的なコードを共有して、画像アップロード...
MySQL タイム ブラインド インジェクションの 5 つの遅延方法 (PWNHUB の予期しない解...
この記事では、JavaScriptの長い画像スクロールの具体的なコードを参考までに共有します。具体的...
従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...
日常業務では、次のようなレイアウトに遭遇することがあります。親要素のフレーム (ブラウザのサイズに応...
この記事では、シンプルなカルーセルを実装するためのJavaScriptの具体的なコードを参考までに紹...
目次1. Dockerイメージ2. 既存のイメージに基づいてインスタンスを作成する3. ローカルテン...
フォーカス画像は、画像、テキスト、動的なインタラクティブ効果を統合したコンテンツを表示する方法です。...
MTR は Mini-Transaction の略です。名前が示すように、これは「最小のトランザクシ...
コマンド: mysqlhotcopyこのコマンドは、ファイルをコピーする前にテーブルをロックし、不完...
mysql が正常に実行されている場合、テーブル構造を表示することは難しくありません。しかし、場合...
水平方向では、行の配置を左、中央、右に設定できます。基本的な構文<TR ALIGN="...
定義と使用法display プロパティは、要素が生成するボックスのタイプを指定します。例示するこの属...
序文「データベース トランザクションの特徴は何ですか?」と尋ねられたら、 ACID 特性である原子性...
目次ステップ1: プロジェクトをインストールするディレクトリにnode_modulesをインストール...