검색결과 리스트
글
Read committed VS Repeatable read
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)
OLAP 환경에서 보고서를 작성할때 다른 트랜잭션에서 발생하는 데이터의 추가/삭제/변경분이 이슈원인이 될 수 있는 상황이라면 Repeatable read 모드를 통한 해결이 가능합니다.
'POSTGRESQL' 카테고리의 다른 글
은전한닢 형태소 분석기와 full-text-search 모듈 연동 (0) | 2018.12.10 |
---|---|
vacuum / vacuum full 의 차이 (0) | 2018.12.05 |
gdb를 통한 postgresql 소스 디버깅 (1) | 2018.12.05 |
replication 자동구성 스크립트(테스트 only) (0) | 2018.12.04 |
신규컬럼 추가 시 default value에 의한 lock 발생현상 및 회피요령 (0) | 2018.12.03 |