楽観的同時実行制御(OCC)とマルチバージョン同時実行制御(MVCC)の違いは何ですか?
これまでのところ、どちらも更新のバージョンチェックに基づいていることを私は知っています。
OCCでは、読み取りアクセスのロックを取得しないトランザクションについて読みましたが、バージョンがインクリメントされてバージョンチェックが失敗した場合に失敗する後の更新についてのみです。この場合、トランザクションはロールバックされます。
MVCCでは、基本的に同じですか?違いはどこですか?
楽観的同時実行制御(OCC)とマルチバージョン同時実行制御(MVCC)の違いは何ですか?
これまでのところ、どちらも更新のバージョンチェックに基づいていることを私は知っています。
OCCでは、読み取りアクセスのロックを取得しないトランザクションについて読みましたが、バージョンがインクリメントされてバージョンチェックが失敗した場合に失敗する後の更新についてのみです。この場合、トランザクションはロールバックされます。
MVCCでは、基本的に同じですか?違いはどこですか?
これらは同じ意味で使用されることもあると思います。トランザクションに 1 つのオブジェクトのみが含まれる場合、それらは本質的に同じですが、MVCC は、複数のオブジェクトが含まれる場合に保証を提供する楽観的同時実行の拡張 (またはそのバージョン) です。A と B という 2 つのオブジェクトがあるとします。これらは、それらの間で何らかの不変条件を維持する必要があります。たとえば、これらは合計が定数である 2 つの数値です。ここで、トランザクション T1 が A から 10 を引いて B に加算し、同時に別のトランザクション T2 が 2 つの数値を読み取っています。A と B を別々に楽観的に更新したとしても (それらを CAS)、T2 は 2 つの数値の一貫性のないビューを取得する可能性があります (たとえば、変更前に A を読み取り、変更後に B を読み取る場合)。MVCC は、T2 が A と B の一貫したビューを読み取れるように、古い値を返す可能性があることを保証します。つまり、
要約すると、楽観的ロック (または楽観的同時実行制御) は、ロックなしの同期の一般原則です。MVCC は、複数のオブジェクトにまたがる分離されたトランザクションを可能にする楽観的な手法です。
質問に直接答えるために、マルチバージョン同時実行制御 (MVCC) は同時実行制御方法であり、(通常)楽観的同時実行制御 (OCC) のカテゴリに属します。
同時実行制御の主なアプローチは 2 つあります。
悲観的同時実行制御の広く知られているアルゴリズムの 1 つに2 フェーズ ロックがあります。
オプティミスティック同時実行制御の 2 つの広く知られているアルゴリズムは次のとおりです。
これら 2 つのアルゴリズムの主な違いは次のとおりです。タイムスタンプベースのアルゴリズムは、オブジェクトに最後にアクセスしたトランザクションを示す単一のタイムスタンプ (より正確には、読み取りと書き込みの操作の種類ごとに 1 つ) を各オブジェクトに割り当てます。そのため、各トランザクションは、オブジェクトにアクセスした最後のトランザクションと競合するかどうかを操作中にチェックします。マルチバージョン アプローチでは、各オブジェクトの複数のバージョンが維持され、それぞれがトランザクションに対応します。その結果、競合する可能性のあるトランザクションが、場合によっては中止する代わりに、新しいバージョンを書き込むことができるため、複数バージョンのアプローチは、最初のアプローチよりも中止を少なくすることができます。ただし、これは、すべてのバージョンに必要なより多くのストレージを犠牲にして実現されます。
厳密に言えば、MVCC は主にデータの保存方法、つまり各データ項目に複数の物理バージョンが存在する可能性があるという事実に関係しています。その結果、悲観的な方法 (ロックなど) と組み合わせることも理論的には可能ですが、そのマルチバージョンの性質は楽観的な方法と組み合わせるのが最適です。