동시 쓰기 예
다음 유사 코드 예는 동시에 실행되는 트랜잭션이 어떻게 진행되는지 또는 대기하는지 보여 줍니다.
같은 테이블에 대한 동시 COPY 작업
트랜잭션 1은 LISTING 테이블에 행을 복사합니다.
begin; copy listing from ...; end;
트랜잭션 2는 별도의 세션에서 동시에 시작되며, LISTING 테이블에 더 많은 행을 복사하려 시도합니다. 트랜잭션 2는 트랜잭션 1이 LISTING 테이블에서 쓰기 잠금을 풀 때까지 기다려야 하며, 그런 다음에야 진행될 수 있습니다.
begin; [waits] copy listing from ; end;
트랜잭션 하나 또는 둘 모두에 COPY 명령 대신 INSERT 명령이 포함된 경우, 똑같은 동작이 발생합니다.
같은 테이블로부터의 동시 DELETE 작업
트랜잭션 1은 테이블에서 행을 삭제합니다.
begin; delete from listing where ...; end;
트랜잭션 2는 동시에 시작되어 같은 테이블에서 행을 삭제하려 시도합니다. 트랜잭션 2는 트랜잭션 1이 완료되기를 기다렸다가 행 삭제를 시도하므로 성공합니다.
begin [waits] delete from listing where ; end;
트랜잭션 하나 또는 둘 모두에 DELETE 명령 대신 같은 테이블에 대한 UPDATE 명령이 포함된 경우, 똑같은 동작이 발생합니다.
읽기 작업과 쓰기 작업이 혼합된 동시 트랜잭션
이 예에서 트랜잭션 1은 USERS 테이블에서 행을 삭제하고 이 테이블을 다시 로드하여 COUNT(*) 쿼리를 실행한 다음 ANALYZE하고 마지막으로 커밋합니다.
begin; delete one row from USERS table; copy ; select count(*) from users; analyze ; end;
그러는 동안 트랜잭션 2가 시작됩니다. 이 트랜잭션은 추가적인 행을 USERS 테이블에 복사해 테이블을 분석한 다음 첫 번째 트랜잭션과 동일한 COUNT(*) 쿼리를 실행하려 시도합니다.
begin; [waits] copy users from ...; select count(*) from users; analyze; end;
두 번째 트랜잭션은 첫 번째 트랜잭션이 완료될 때까지 기다려야 하므로 성공합니다. 이 트랜잭션의 COUNT 쿼리는 완료한 로드를 기준으로 카운트를 반환합니다.