トランザクションには原子性、一貫性、分離、永続性という4つの主な特徴があることを知っておいてください。今日はそのうちの分離と、Mysql における複数バージョンの同時実行制御と分離の関係について見ていきます。
トランザクションの分離
コミットされていないトランザクションを読む: トランザクションがコミットされていない場合、そのトランザクションが行った変更は他のトランザクションから見ることができます。
コミット済み読み取り: トランザクションがコミットすると、そのトランザクションが行った変更が他のトランザクションから見えるようになります。
繰り返し読み取り: トランザクションの実行中に見られるデータは、トランザクションの開始時に見られるデータと常に同じです。つまり、トランザクションがレコードを複数回照会しても、同じデータが表示されます。
シリアライゼーション:その名が示すように、レコードの同じ行に対して、"書き込み "は、"書き込みロック "を追加します、"読み取り "は、"読み取りロック".読み取りロックと書き込みロックが競合している場合、アクセス後のトランザクションは、実行を続行するには、前のトランザクションの完了を待たなければなりません。
注:Mysqlのデフォルトの分離レベルは繰り返し読み取りです。そしてInnoDBの繰り返し読み取りレベルはギャップロックによってファントム・リードの問題を解決します。
複数バージョンの同時実行制御
簡単に言うと、データベースの同時実行制御に単純に行ロックを使うのではなく、データベースの行ロックと複数バージョンの行を組み合わせることで、ノンロック・リードを実現するためのオーバーヘッドをほとんど必要としなくなりました。
注意: 複数バージョンの同時実行制御は、読み取りコミットと繰り返し読み取り分離レベルのみです。
利点
ロックのない読み取り、読み取りと書き込みの非競合。
読み取りが多く書き込みが少ないOLTPアプリケーションでは、読み取りと書き込みの非競合は非常に重要であり、システムの同時実行性能を大幅に向上させます。
次の図は、マルチバージョンとは何かを図式化したものです。
さらに、あなたは、右、いつ削除するアンドゥログが常に存在することはできないことを尋ねるかもしれませんか?その答えは、InnoDBが、システム内に可視化できるトランザクションが存在しないことを自ら判断し、具体的に知るためです。
次のイメージは、InnoDBのコードがトランザクションを通じてバージョンの可視性をどのように制御できるかを示しています。
繰り返し読み取り分離レベルでは、各トランザクションの最初にトランザクションIDを適用し、一貫性のある読み取りビューを開きます。これはトランザクション開始時にスナップショットを取ることと同じです。
ポイントは、各トランザクションのInnoDBは、トランザクションの開始の瞬間、現在のシステムと開始を保存する配列を構築したが、コミットされていないすべてのトランザクションIDです。
現在のトランザクションを照会る時、配列にないローウォーターマーク以下とハイウォーターマーク以下のデータだけがチェックされます。
次の図はこのプロセスを説明するもので、この分析が繰り返し読み取り分離レベルであることを強調しています。
- トランザクションAが開かれ、トランザクションIDは100ですが、この時間は、すべてのシステムを取得するトランザクションIDは、99、100があると仮定するので、トランザクションは、トランザクションの配列を維持する[99、100]は、それが唯一の99の更新データを見ることができる上記のルールによると、独自のトランザクション100は、この時間は、レコードをチェックする準備です
- トランザクションBが開いている、トランザクションIDのアプリケーションは101です、トランザクションBは、[99、100、101]であるトランザクションの配列を維持し、フィールドの値k = k + 1を更新する準備が整いました。
- トランザクションCが開いている、トランザクションIDのアプリケーションは102ですが、トランザクションCは、トランザクション配列が[99、100、101、102]、高速のトランザクションCの実装を維持し、k = k + 1の最初の実行は、レコードの行を変更するとなる、最新のデータの102番目のトランザクションによって更新されます
- トランザクションCがコミットした後、トランザクションBの実行を開始し、トランザクション102によって更新されたデータは、履歴バージョンになります。現在のバージョンは、トランザクション101によって更新された最新のデータになります。
- トランザクションBが実行を終了してコミットし、トランザクションAが正式に変更された行の照会を開始したと仮定した場合、マルチバージョン同時実行制御を適用して得られるべき値は何ですか?正解です。
なぜですか?
上記のルールでは、トランザクション102とトランザクション101がコミットされているからです。しかし、ルールによると、トランザクションは、トランザクションIDのアプリケーションが100であるときに開かれた、ステップ1でマルチバージョン同時実行制御のルールのために、言われている、トランザクションは、99以下のトランザクションだけでなく、独自のトランザクション100の更新データによって更新されたデータを見ることができる、このルールによると、行のレコードの変更にクエリのInnoDBは、より多くの元に戻すログロールバックは、102番目のトランザクションであることを見つけるために更新され、ロールバックをロールバックし続け、それが90番目のトランザクションが更新され、目に見える、戻り値であることがわかります。
上記は、すべてのコンテンツのマルチバージョン同時実行制御への導入であり、それはシステムでのみ元に戻すログがコミットされていないトランザクションに存在しないことがわかりますが、時間に表示されることがあります、それはクリアされます、元に戻すログの回復は非常に不親切ですが、長いトランザクションに加えて、また、リソースをロックにかかるだけでなく、システムに大きな影響を与える、ああ長いトランザクションを避けるために確認してください。