InnoDB の MVCC は、レコードの各行の背後に 2 つの非表示列を保存することによって実装されます。これら 2 つの列のうち、1 つは行の作成時刻を保持し、もう 1 つは行の有効期限 (または削除時刻) を保持します。もちろん、保存されるのは実際の時間値ではなく、システムのバージョン番号です。新しいトランザクションが開始されるたびに、システムのバージョン番号が自動的に増加します。トランザクションの開始時のシステム バージョン番号は、トランザクションのバージョン番号として使用され、クエリされたレコードの各行のバージョン番号と比較するために使用されます。MVCC が反復読み取り分離レベルでどのように動作するかを見てみましょう。
InnoDB は、次の 2 つの条件に従って各行レコードをチェックします
a. InnoDB は、現在のトランザクションより前のバージョンのデータ行のみを検索しますversion (つまり、行のシステム バージョン番号がトランザクションのシステム バージョン番号以下である)、これにより、トランザクションによって読み取られた行が、トランザクションの開始前にすでに存在しているか、挿入されているかが保証されます。トランザクション自体によって変更されます。
b. 行の削除されたバージョンは未定義であるか、現在のトランザクションのバージョン番号より大きいです。これにより、トランザクションによって読み取られた行が、トランザクションの開始前に削除されていないことが保証されます。
上記の 2 つの条件を満たすレコードのみがクエリ結果として返されます。
InnoDB は、現在のシステム バージョン番号を、新しく挿入された各行の行バージョン番号として保存します。
InnoDB は、現在のシステム バージョン番号を保存します削除された行ごとに、システムのバージョン番号が行削除識別子として機能します。
InnoDB は、新しいレコード行を挿入し、現在のシステム バージョン番号を行バージョン番号として保存し、現在のシステム バージョン番号を行削除識別子として元の行に保存します。
ほとんどの読み取り操作をロックせずに実行できるように、これら 2 つの追加のシステム バージョン番号を保存します。この設計により、データ読み取り操作が非常にシンプルになり、パフォーマンスが非常に向上し、また、規格を満たす行のみが確実に読み取られるようになります。欠点は、レコードの各行に追加の記憶域スペース、より多くの行チェック作業、および追加のメンテナンス作業が必要になることです。
MVCC は、REPEATABLE READ (反復可能読み取り) と READ COMMITTED (読み取りコミット) の 2 つの分離レベルでのみ機能します。 READ UNCOMMITTED は、現在のトランザクション バージョンに準拠するデータ行ではなく、常に最新のデータ行を読み取るため、他の 2 つの分離レベルは MVCC と互換性がありません。 SERIALIZABLE は、読み取られたすべての行をロックします。
関連する学習の推奨事項: mysql データベース
以上がInnoDB MVCC の仕組みを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。