導入コンテンツから始めましょう。誰もが次のような面接のシナリオに遭遇したことがあると思います。 インタビュアー: 「MySQL にはトランザクション分離レベルがいくつありますか?」 上記のような恥ずかしい状況を避けるために、読み続けてください。 Mysql のデフォルトのトランザクション分離レベルは、Repeatable Read です。Mysql は、インターネット プロジェクトでも、変更を加えずにデフォルトの分離レベルを使用しますか? 何!実際には Read Committed です。インターネットでは、この分離レベルでは 文章まず、質問について考えてみましょう。Oracle と SqlServer では、デフォルトの分離レベルとして Read Commited が選択されています。MySQL では、デフォルトの分離レベルとして Read Commited ではなく、Repeatable Read が選択される理由は何でしょうか。 なぜ?なぜ?なぜ? これには歴史的な理由があり、もちろんマスター スレーブ レプリケーションから始める必要があります。 binlog レプリケーションに基づいています。ここでは binlog の概念を取り上げたくありません。binlog はデータベースの変更を記録するファイルであるということだけ理解してください。 はい、3つのタイプがあります。
MySQL 5.0 より前では、binlog は このとき、マスター上で次の文を実行します。 テストから*を選択します。 出力は次のようになります
ただし、この時点でスレーブでこのステートメントを実行すると、出力は次のようになります。
このように、マスターとスレーブの不整合という問題が発生します。理由は実は非常に単純で、マスターでの実行順序は最初に削除し、次に挿入するということです。現時点では、binlog は STATEMENT 形式になっており、レコードの順序は最初に挿入、次に削除です。スレーブは binglog と同期しているため、スレーブの実行順序がマスターの実行順序と一致しません。マスタースレーブ 矛盾している! どうすれば解決できるでしょうか?解決策は2つあります。 MySQL がデフォルトの分離レベルとして Repeatable Read を選択する理由を理解した後、それを Read Commited と比較して、インターネット プロジェクトで分離レベルが Read Commited に設定されている理由を説明しましょう。 対比 さて、まずは一つ理解しておきましょう! Read UnCommitted と Serializable の 2 つの分離レベルは、次の 2 つの理由によりプロジェクトでは使用されません。
言い換えれば、私たちが気にしなければならない質問は 1 つだけです。分離レベルは、コミット読み取りにすべきか、それとも繰り返し読み取りにすべきかということです。 テーブル「test」を作成します( `id` int(11) NULLではない、 `color` varchar(20) NOT NULL, 主キー (`id`) ) エンジン=InnoDB データは以下のとおりです +----+-------+ | ID | 色 | +----+-------+ | 1 | 赤 | | 2 | 白 | | 5 | 赤 | | 7 | 白 | +----+-------+ 説明を簡単にするために、以下
理由 1: RR 分離レベルではギャップ ロックが存在するため、デッドロックの可能性が RC よりもはるかに高くなります。 更新のために、ID <3 のテストから * を選択します。 RR 分離レベルでは、ギャップ (2,5) をロックして他のトランザクションによるデータの挿入を防ぐことができるギャップ ロックがあります。 理由 2: RR 分離レベルでは、条件列がインデックスにヒットしない場合、テーブルがロックされます。 RC分離レベルでは、行のみがロックされます<br /> この時点で、ステートメントが実行されます テストセット color = 'blue' を更新します (color = 'white' の場合)。 RC 分離レベルでは、最初にクラスター化インデックスを調べて完全スキャンを実行します。ロックは次のとおりです。 しかし、実際には、MySQL は最適化されています。MySQL サーバーは条件をフィルタリングし、条件が満たされていないことを検出すると、unlock_row メソッドを呼び出して、条件を満たさないレコードをロックします。 実際のロックは以下のとおりです ただし、RR 分離レベルでは、クラスター化インデックスが完全にスキャンされ、次に示すようにテーブル全体がロックされます。 理由 3: RC 分離レベルでは、半一貫性読み取り機能により更新操作の同時実行性が向上します。 5.1.15 では、InnoDB に「半一貫性」と呼ばれる概念が導入され、同じレコード行を更新する際の競合が軽減され、ロック待機が削減されました。 テスト セット color = 'blue' を更新します (color = 'red' の場合)。 まだトランザクションをコミットしないでください。 テストセット color = 'blue' を更新します (color = 'white' の場合)。 セッション 2 が行をロックしようとすると、その行にすでにロックが存在することがわかります。InnoDB は半一貫性読み取りを有効にし、コミットされた最新のバージョン (1、赤)、(2、白)、(5、赤)、(7、白) を返します。 MySQL は読み取り操作を再開し、今回は行の最新バージョンを読み取り (そしてロックし) ます。 2つの質問RC レベルでは、非反復読み取りの問題を解決する必要がありますか? RC レベルでは、マスター スレーブ レプリケーションにどのような binlog 形式が使用されますか? 要約するこの記事はただ 1 つのことを説明するものです。インターネット プロジェクトでは、分離レベルとして Read Commited を使用してください。 これで、MySQL プロジェクトでトランザクション分離レベルを選択する方法についての記事は終了です。MySQL トランザクション分離レベルの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: html+cssレイアウトの3つの方法(ナチュラルレイアウト/フローレイアウト/ポジショニングレイアウト)
目次Refsとは何か1. 文字列型参照2. コールバック参照React.createRef() 4....
Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...
目次Linux ドライバーの共通機能 (copy_from_user open read write...
この記事の例では、検証コードを実装するためのjsの具体的なコードを参考までに共有しています。具体的な...
コード:コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC &...
この記事では、例を使用して、MySQL ビューの作成 (CREATE VIEW) と使用上の制限につ...
MySQL トランザクション サポートは、MySQL サーバー自体にバインドされているのではなく、ス...
1. this.$router.push() 1. ビュー <テンプレート> <d...
目次問題の説明:原因分析:解決:補足: Reactでは、フックが使用されている場合、useState...
このノートでは、 MySQL の B+Tree インデックスとは何ですか?クラスター化インデックスは...
目次序文解決具体的な実装満たすべき前提条件質問序文テーブルをよく使用します。データ量が多い場合は直接...
2つのケース: 1. 索引あり 2. 索引なし前提条件:方法: コマンドラインを使用してシミュレート...
背景ご存知のとおり、nginx は高性能な Web サーバーであり、負荷分散やリバース プロキシによ...
目次ドロップダウン複数選択ボックスアップグレード - すべてのオプションを追加改訂と改善を求める製品...
Ansible を使用する学生は、以下に示すように、Ansible が特定のフォルダーまたはファイル...