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

完了

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

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

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

トランザクション

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

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

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