マルチバージョン同時実行制御 (MVCC) は、同時実行制御テクノロジです。データベース同時実行制御を実装する MVVC は、UNDO ログ内のバージョン チェーンから切り離すことができません。これは、データ行の複数のバージョンを維持することによって実現されます。
簡単に言うと、現在のトランザクションは、別のトランザクションによって変更されている行をクエリします (この時点で読み取られるとダーティ リードが発生します)。ロックして待機する代わりに、データの履歴バージョンが読み取られます。応答時間が短縮されます。
MVVC は、Undo ログと Read View という 2 つのテクノロジによって実装されています。
MySQL InnoDB での MVCC の実装は、主にデータベースの同時パフォーマンスを向上させ、読み取り/書き込みの競合を処理するより良い方法を使用することを目的としています。読み取りと書き込みの競合がある場合でも、ロックとノンブロッキングの同時読み取りは実現できず、この読み取りは現在の読み取りではなくスナップショット読み取りを指します。現在の読み取りは実際にはロック操作です。
読み取られたレコードが最新のデータであることを確認し、他の同時トランザクションによってレコードが変更されるのを防ぐために、読み取り時にレコードをロックする必要があります。
ロックされた読み取りは現在の読み取りと呼ばれ、データの追加、削除、または変更には最初にデータを読み取る必要があります。この読み取りプロセスも現在の読み取りです。
SELECT * FROM t LOCK IN SHARE MODE; # 共享锁 SELECT * FROM t FOR UPDATE; # 排他锁 UPDATE SET t..
スナップショット読み取りは一貫性読み取りとも呼ばれ、データ行のスナップショット バージョンを読み取ります。 MySQL では、通常の select ステートメント (共有モードでの for update または lock のない select ステートメント) は、デフォルトでロックなしでスナップショット読み取りを使用します。
SELECT * FROM table WHERE ...
その理由は、スナップショットの読み取りによってロック操作が回避され、オーバーヘッドが軽減されるためです。
トランザクションの分離レベルがシリアルの場合、スナップショット読み取りは役に立たず、現在の読み取りに低下します。
分離レベル:
MySQL のデフォルトの分離レベルは反復読み取り RR であり、非反復読み取りの問題を解決できます。 MySQL では、ファントム読み取りの問題を解決するための特別なサポートが提供されています。
ファントム・リーディングの問題はどのように解決されるのでしょうか?
ID 8 のトランザクションがデータを作成すると、レコードの概略図は次のようになります。
ID 10 と 20 の 2 つのトランザクションがこのレコードを更新すると仮定します。プロセスは次のとおりです:
事20 | |
---|---|
UPDATE 学生 SET name='李思' WHERE id=1; | |
UPDATE 学生 SET name='王五' WHERE id=1; | |
##COMMIT; | |
# #学生セットを更新name='Zhao Liu' WHERE id=1; | |
学生セットを更新 name='Qian Qi' WHERE id=1; | |
以上がMySQL MVVC マルチバージョン同時実行制御を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。