序文 前回の記事「MySQL ロック メカニズムの詳細説明」では、InnoDB のロック メカニズムについて詳しく説明しました。ロック メカニズムは、同時実行状況でデータの正確性を確保するために使用されます。データの正確性を確保するには、通常、トランザクションが必要です。MySQL ストレージ エンジン InnoDB は、ロック メカニズムを通じて、トランザクションの分離特性に 4 つの分離レベルを巧みに実装しています。 トランザクションの ACID 特性。I は分離を表します。分離とは、複数のユーザーの同時トランザクションが同じデータベースにアクセスする場合、あるユーザーのトランザクションが他のユーザーのトランザクションによって干渉されず、複数の同時トランザクションが互いに分離されることを意味します。 トランザクションの特性は誰もが知っています。データベースの一貫性と分離性は、トランザクションを実装するための基本的な考え方です。システムに多数の同時アクセスがある場合、データベース独自のトランザクション分離レベルを理解して巧みに適用することが、強力な同時処理機能を備えた堅牢なコードを作成する上で重要な役割を果たします。 1. 取引が互いに干渉し合う仕組み 1 つのトランザクションが他のトランザクションにどのように干渉しますか?たとえば、次の表があります。 テーブル lock_example(id smallint(10),name varchar(20),主キー id) を作成します。engine=innodb; 表には次のデータが含まれています。
デモ1: トランザクション A が最初に実行され、コミットされていない状態になります。 t 値に挿入します(4, 'zhaoliu'); 後で実行されるトランザクション B もコミットされません。 t から * を選択します。 トランザクション B がレコード (4、zhaoliu) を読み取ることができる場合、トランザクション A がトランザクション B に影響を与えていることを意味します。この影響は「ダーティ リード」と呼ばれ、コミットされていないトランザクション操作のレコードが読み取られます。 デモ2: トランザクション A を最初に実行します。 id=1 の t から * を選択します。 結果セットは
トランザクション B は後で実行され、コミットされます。 更新 t set name=xxx where id=1; 専念; トランザクション A は同じクエリを再度実行します。 id=1 の t から * を選択します。 結果セットは次のとおりです。
今回は、コミットされたトランザクション B がトランザクション A に影響を与えます。この影響は「非反復読み取り」と呼ばれ、トランザクション内の同じクエリが異なる結果を生成します。 デモ3: トランザクション A を最初に実行します。 id>3 の t から * を選択します。 結果セットは次のとおりです。
トランザクション B は後で実行され、コミットされます。 t値(4, zhaoliu)に挿入します。 専念; トランザクション A は最初に id>3 を照会し、結果は NULL なので、id 4 のレコードを挿入します。 t値(4, xxoo)に挿入します。 結果セットは次のとおりです。
こう思っているかもしれません。 。 。冗談でしょ?確認したところ、id>3 の場合は空のセットでしたが、id=4 を挿入すると PK の競合が発生したと表示されました。 →_→ 今回、コミットされたトランザクション B がトランザクション A に与える影響は「ファントム リード」と呼ばれます。 前述のように、同時トランザクションにより、他のトランザクションでダーティ リード、反復不可能なリード、ファントム リードが発生する可能性があります。上記の状況を回避するために、InnoDB はどのような取り組みを行ってきたのでしょうか? 2. InnoDB はどのようなトランザクション分離レベルを実装していますか? InnoDB は 4 つの異なるトランザクション分離レベルを実装します。
異なるトランザクションの分離レベルは、実際には一貫性と同時実行性の間のトレードオフです。 3. InnoDB で 4 つのトランザクション分離レベルを実装するにはどうすればよいですか? InnoDB は、さまざまな分離レベルを実装するためにさまざまなロック戦略を使用します。 a. コミットされていない読み取り このトランザクション分離レベルでは、選択ステートメントはロックされず、スナップショット読み取りも行われません。 SELECT ステートメントはロックなしで実行されます。 このとき、矛盾したデータが読み取られる可能性があり、これを「ダーティ リード」と呼びます。これは、同時実行性が最も高く、一貫性が最も低い分離レベルです。 b. 読み取りコミット (RC)
この時点では、他のトランザクションの挿入は引き続き実行される可能性があり、ファントム レコードが読み取られる可能性があります。このレベルは最も一般的に使用されます。また、ロック解除された選択の場合、繰り返し不可能な読み取りが発生する可能性があります。 このレベルでは、スナップショット読み取りによってダーティ リードが防止されます。このレベルでのスナップショット読み取りでは、常に最新の行データ スナップショットを読み取ることができるため、当然、コミットされたトランザクションによって書き込まれる必要があり、そのため、繰り返し不可能な読み取りが発生する可能性があります。 c. 繰り返し読み取り (RR) これは、RR における InnoDB のデフォルトの分離レベルです。
このレベルでは
d. シリアル化可能 このトランザクション分離レベルでは、すべての select ステートメントが暗黙的に共有モードの select ... に変換されます。つまり、共有読み取りロック (S ロック) がデフォルトで設定されます。 したがって、トランザクション A が最初に次の SQL ステートメントを実行すると、クエリされた行の IS ロック (他の IS および IX ロックと互換性がある) を取得しようとします。このとき、他のトランザクションもこれらの行の IS ロックまたは S ロックを取得できます。ただし、トランザクション A が次に行の一部を更新または削除すると、X ロックを取得します。他のトランザクションは、IS ロックを取得しようとするため、通常の SELECT ステートメントを実行してもブロックされます。ただし、IS ロックと X ロックは相互に排他的です。これにより、ダーティ リード、非反復リード、ファントム リードが回避され、すべてのトランザクションはシリアルにのみ実行できます。 ...を選択します。 これは最も一貫性がありますが、同時実行性は最も低い分離レベルです。同時実行性の高いシナリオでは、上記の 2 つの分離レベル a と d はほとんど使用されません。 4. 結論 同時実行トランザクション間の相互干渉により、ダーティ リード、反復不可能なリード、ファントム リードなどの問題が発生する可能性があります。 InnoDB は、SQL92 標準の 4 つの分離レベルを実装します。
InnoDBのデフォルトの分離レベルはRRであり、最も一般的に使用される分離レベルはRCである。 要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
1: MySqlをダウンロードする公式サイトのダウンロードアドレス: https://dev.mys...
目次1. Commonjsのエクスポートとrequireの使用1.1 CommonJS エクスポート...
デザイナーは独自のフォント ライブラリを持っているため、プロジェクトの設計時にすぐに使用できます。今...
目次序文vue-cli 2.0 バージョンvue-cli 3.0 バージョン要約する序文vue-cl...
まず、イメージをプルします(またはコンテナを作成するだけで、自然にプルされます)。 docker p...
テキスト入力でプレースホルダーを使用していますが、問題なく動作します。しかし、選択ボックスにはプレー...
ウェブページでEnterキーを押すと、フォームは自動的に送信され、他のページに移動します。クエリフォ...
目次1. インデックスの基本1.1 はじめに1.2 インデックスの仕組み1.3 インデックスの種類1...
目次1. Vueの初期化vue エントリ ファイルフルバージョンとランタイムバージョンの違い1.1、...
<br />オリジナル: http://www.alistapart.com/artic...
1: 文字列を区切るためのストアドプロシージャを定義する 区切り文字 $$ `mess`$$ を使う...
この記事の例では、マウス切り替え画像を実現するためのjsの具体的なコードを参考までに共有しています。...
これはモーダル ボックスのドラッグのケースです。ここで実装する関数は次のとおりです。 1. ポップア...
昨日、パソコンにPHP開発環境をセットアップした後、Apacheサーバーを再起動するとエラーが続きま...
この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...