Database

[Postgresql] Transaction Isolation Level

zamezzz 2022. 5. 20. 17:14

트랜잭션 격리 수준 (Transaction Isolation Level)
- 여러 트랜잭션이 동시에 처리될 때 하나의 트랜잭션이 다른 트랜잭션과의 격리 수준을 어떻게 할지 결정하는 레벨.


PostgreSQL에서는 4가지의 표준 Transaction Isolation Level이 있습니다.

먼저 PostgreSQL에서 트랜잭션을 설정하는 방법은 아래 공식 문서를 참고하시면 됩니다.
https://www.postgresql.org/docs/current/sql-set-transaction.html


격리 수준은 READ UNCOMMITTED -> SERIALIZABLE 순서로 높아지며, 기본 값은 READ COMMITTED입니다.

1) READ UNCOMMITTED

설정에는 정의되어 있지만, 사실상 지원하지 않는다고 합니다.

직접 테스트해보면 결과는 READ COMMITTED와 동일함을 보인다고 합니다.


2) READ COMMITTED
커밋된 데이터만 읽을 수 있습니다.
다른 트랜잭션에서 커밋하지 않는 데이터를 읽을 수 있는 것을 DIRTY READ라고 합니다.
READ COMMITTED에서는 DIRTY READ가 불가능합니다.


3) REPEATABLE READ
데이터 조회 시 항상 동일한 데이터 응답을 보장합니다.

READ COMMITTED 레벨에서는 하나의 데이터 조회 후 다시 조회할 때 그 값이 다를 수 있습니다. 다른 트랜잭션에서 해당 데이터를 업데이트할 수 있기 떄문입니다.
이렇게 다른 트랜잭션에서 데이터를 업데이트 하는 것을 NON REPEATABLE READ 라고도 부르며, REPEATABLE READ 레벨에서는 이를 방지할 수 있습니다.



4) SERIALIZABLE 
모든 작업은 동시에 일어나지 않고, 하나의 트랜잭션에서 처리하는것처럼 동작합니다.
그러므로 성능이 떨어집니다.

여기서는 Phantom Read를 방지 할 수 있습니다.
Phantom Read란 현재 트랜잭션이 update 명령어를 커밋 후 재조회했을 때 다른 값이 보이거나 데이터가 없어진 경우입니다.

이상으로 4개의 Transaction Isolation Level에 대해 정리했습니다.
감사합니다.

반응형

'Database' 카테고리의 다른 글

[PostgreSQL] upsert 시 excluded 명령어  (0) 2022.03.25