序文 「データベース トランザクションの特徴は何ですか?」と尋ねられたら、 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 フォルダ共有サーバー構成の詳細な説明
HTML5 のドラッグ アンド ドロップ機能は誰もが知っていますが、これを使用するとドラッグ アンド...
音楽を再生すると、曲が進むにつれて歌詞が徐々に色づきます。色は単語ごとに変わるのではなく、左から右へ...
ffmpeg は非常に強力なオーディオおよびビデオ処理ツールです。公式 Web サイトは http:...
序文:多くのビジネス テーブルでは、歴史的またはパフォーマンス上の理由により、最初のパラダイムに違反...
この記事の例では、カスタムスクロールバーを実装するためのjsの具体的なコードを参考までに共有していま...
今日は、「ローテク」の問題について書きたいと思います。ちなみに、私は JavaScript Week...
MySQL での置換例の詳細な説明replace into は insert と似ていますが、rep...
たくさんのリンクおそらく、このようなサイトをたくさん見たことがあるでしょう。ページの下部に 50 個...
背景何が起こったかというと、Luzhu は偶然、宇宙で最高の外部スピーカーを備えた携帯電話について知...
質問会社がサーバーを移行した後、デフォルトで作成された docker0 ブリッジが会社の外部ネットワ...
目次主に使用されるPostmanの機能データの暗号化と復号化さまざまなパラメータ設定実際に送信された...
Dockerfile でのボリュームのマウントと docker -v コマンドによるマウントには明ら...
MySQL パフォーマンスの最適化MySQL はインターネット企業で広く使用されており、MySQL ...
今では多くの人がウェブサイト作成に参加していますが、ウェブサイトはどのように作成すればよいのでしょう...
まず公式サイトにアクセスしてダウンロードし、MySQLダウンロードをクリックします。 ダウンロードし...