Read committed VS Repeatable read

POSTGRESQL 2019. 12. 18. 11:32

postgreSQL은 SQL 표준 트랜잭션 고립화 수준 중 Read committed, Repeatable read, Serializable 를 지원합니다. 그중 Read committed와 Repeatable read의 차이에 대해 정리해 보려 합니다.

 

1. Read committed : postgreSQL 의 default 고립화수준으로 begin 명령으로 트랜잭션을 시작하면 Read committed 모드가 적용됩니다. 쿼리가 시작되기 전 다른 트랜잭션에서 commit 된 결과를 참조할 수 있으며 동일 트랜잭션 상에서 동일한 쿼리문에 대해 서로 다른 결과를 조회(Phantom-Read)할 수 있습니다.

다시말해, 트랜잭션 내에서 같은 SELECT문을 실행하더라도 다른 트랜잭션의 commit 여부에 따라 다른 결과가 출력됩니다.

 

< 테스트 >

- TRANSACTION #1

postgres=# SHOW default_transaction_isolation;
 default_transaction_isolation 
-------------------------------
 read committed
(1 row)

postgres=# create table transaction_isolation_test(c1 int);
CREATE TABLE
postgres=# insert into transaction_isolation_test select 1 from generate_series(1,10) as n;
INSERT 0 10
postgres=# begin;
BEGIN
postgres=# select sum(c1) from transaction_isolation_test ;
 sum 
-----
  10
(1 row)

- TRANSACTION #2에서 1건 삽입

postgres=# begin;
BEGIN
postgres=# insert into transaction_isolation_test values(1);
INSERT 0 1
postgres=# commit;
COMMIT

- TRANSACTION #1에서 재조회 : TRANSACTION B에서 insert 한 결과가 반영됩니다.

postgres=# select sum(c1) from transaction_isolation_test ;
 sum 
-----
  11
(1 row)

 

 

2. Repeatable read : 트랜잭션이 시작되기 전(쿼리가 시작되기 전이 아닌) commit 된 결과를 참조합니다. phantom-read 를 불허(mysql은 SELECT는 안되는데 UPDATE는 됨.)하므로 트랜잭션 내 같은 쿼리문은 트랜잭션이 시작된 시점의 데이터 스냅샷 정보를 조회하기 때문에 다른 트랜잭션의 commit 여부와 무관하게 항상 같은 결과가 출력됩니다.

 

<테스트>

- TRANSACTION #1

postgres=# truncate table transaction_isolation_test ;
TRUNCATE TABLE
postgres=# insert into transaction_isolation_test select 1 from generate_series(1,10);
INSERT 0 10
postgres=# begin transaction isolation level repeatable read;
BEGIN
postgres=# select sum(c1) from transaction_isolation_test ;
 sum 
-----
  10
(1 row)

- TRANSACTION #2

postgres=# begin;
BEGIN
postgres=# insert into transaction_isolation_test values(1);
INSERT 0 1
postgres=# commit;
COMMIT

- TRANSACTION #1 : TRANSACTION B에서 커밋한 결과가 반영되지 않고 커밋전의 조회결과와 동일한 결과를 반환합니다.

postgres=# select sum(c1) from transaction_isolation_test ;
 sum 
-----
  10
(1 row)

 

<Read committed VS Repeatable read>

 

OLAP 환경에서 보고서를 작성할때 다른 트랜잭션에서 발생하는 데이터의 추가/삭제/변경분이 이슈원인이 될 수 있는 상황이라면 Repeatable read 모드를 통한 해결이 가능합니다.