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;