複数バージョンのコンカレンシー制御 (MVCC) とスナップショットについて理解する

完了

ほとんどのデータベース管理システム (DBMS) ではロックを使用してコンカレンシー制御を適用しますが、PostgreSQL では別の方法でロックを補完します。 PostgreSQL では、複数バージョンのコンカレンシー制御 (MVCC) と呼ばれるシステムを使用します。これにより、同じ行の複数のバージョンが存在し、コンカレンシーが向上します。 このシステムでは、各クエリにより、トランザクション的に一貫性のあるデータの以前のスナップショットが示されます。 MVCC は、データを読み取るトランザクションが、データを書き込んでいるトランザクションをブロックしないようにし、その逆も保証します。

たとえば、接続 A では、テーブルのすべての行をスキャンするクエリを実行します。 同時に、接続 B では、一部の行を更新するクエリを実行します。 MVCC では、影響を受ける行の別のバージョンを作成することで、両方のクエリを同時に実行できます。 このようにして、接続 B では接続 A に影響を与えずに更新を実行できます。このプロセスは各行のバージョンで実現されます。その場合、xmin 値 ''から'' xmax 値 ''まで'' のトランザクションが表示されます。 MVCC では、接続 A クエリの開始後に発生した変更は、接続 A によって無視されます。

元のデータを読み取る読み取りクエリと、スナップショットを更新する書き込みクエリを示すマルチバージョン コンカレンシー制御図の図。

トランザクション

DBMS のトランザクションはアトミック作業単位であるため、トランザクションは完全にコミットされるか、まったくコミットされません。 トランザクションはコンカレンシーの目的でも使用されます。 分離レベルを使用すると、あるトランザクションが他の同時実行トランザクションに与える可能性がある影響を定義できます。

BEGIN TRANSACTION または START TRANSACTION を使用してトランザクションを開始します。 COMMIT を使用してトランザクションを完了し、トランザクションで行われたすべての変更を保存するか、ROLLBACK を使用してトランザクションによって行われた変更を元に戻します。 次に例を示します。

BEGIN TRANSACTION;
    UPDATE production.workorder
        SET stockedqty=7
        WHERE workorderid=1;
COMMIT;