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;