導入コンテンツから始めましょう。誰もが次のような面接のシナリオに遭遇したことがあると思います。 インタビュアー: 「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つの方法(ナチュラルレイアウト/フローレイアウト/ポジショニングレイアウト)
1. 前提条件何度かインストールしているので、エラーについてはこれ以上説明しません。ちょっとわかりに...
この記事では、Web ページの作成を学習するときに注意すべき HTML タグに関するいくつかの問題を...
長い間何もしていなかった人は、努力をすると一生懸命働いていると思うようになります。 1. 問題Nav...
以前の開発では、クラス、名前などの HTML のデフォルト属性を使用していました。 Huawei社の...
今日、Baidu でページを検索したところ、ページが削除されていたため、当然 Baidu スナップシ...
目次序文1. 準備 - サーバーとnginxの使用1. サーバーを準備する2. nginxをインスト...
この記事の例では、Appleの電卓を実装するためのJSの具体的なコードを参考までに共有しています。具...
MySQL 8.0.16 にインストールする場合、「UTF8B3」ではなく「UTF8B4」が使用さ...
序文MySQL の権限を簡単に理解すると、MySQL では自分の能力の範囲内で操作が許可され、その限...
HTML 初心者向けのベストプラクティスを 30 個紹介します。 1. タグを閉じたままにする過去に...
目次序文準備する実装のアイデアコードについて要約する序文WeChat 認証ログインは、WeChat ...
編集者は最近、macOS システムを使い始めたかったので、VMware に macOS イメージ シ...
要件:PC側とモバイル側は2つの独立したプロジェクトです。2つのプロジェクトの内容は基本的に同じで、...
目次序文Ajax シリアルおよびパラレルAjaxの同時リクエスト制御のための2つのソリューションPr...
HTML に触れる初心者は、いくつかの HTML タグを学びます。関連記事:初心者が学ぶ HTML...