DB
[DB] 격리수준
덴마크초코우유
2025. 1. 6. 21:35
반응형
트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이다. 트랜잭션의 격리 수준은 격리 수준이 높은 순서대로 SERIALIZABLE
, REPEATABLE READ
, READ COMMITTED
, READ UNCOMMITED
가 존재한다.
격리 수준이 낮으면 의도했던 코드와 다르게 데이터가 변경될 수 있다. 격리 수준이 낮으면 변경으로 인한 부작용이 발생할 수 있고, 격리 수준이 높으면 시간당 처리할 수 있는 쿼리 수가 낮아지기 때문에 적절한 설정값을 고려해야 한다.
발생할 수 있는 부작용 세 가지
Dirty Read
- 트랜잭션A에서 데이터 변경 후 커밋하기 전에 트랜잭션B에서 데이터를 읽는다.
- 트랜잭션A에서 데이터 변경 후 오류가 발생해 롤백했다면 트랜잭션B는 잘못된 데이터를 사용하게 된다.
Non-Repeatable Read
- 트랜잭션 A가 동일한 데이터를 두 번읽는데 그 사이에 트랜잭션 B가 데이터 변경 후 커밋
- 트랜잭션 A가 읽은 두 데이터의 정합성이 깨진다.
Phantom Read
- 트랜잭션 A가 특정 조건으로 데이터를 검색했는데,
- 트랜잭션 B가 그 조건에 해당하는 데이터를 추가/삭제하여
- A가 다시 검색했을 때 결과 집합이 달라지는 현상
격리 수준별 특징
- 낮은 격리 수준부터 설명
READ UNCOMMITTED
- 커밋되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있다.
- 방지하는 부작용: 없음(Dirty Read, Non-Repeatable Read, Phantom Read 모두 발생 가능)
- 성능은 가장 좋지만 데이터 정합성 보장이 매우 낮다.
READ COMMITTED
- 커밋된 데이터만 읽을 수 있다.
- 방지하는 부작용: Dirty Read
- 대부분의 DBMS에서 기본 격리 수준으로 사용 (Oracle, PostgreSQL, SQL Server 등)
REPEATABLE READ
- 트랜잭션 내에서 같은 데이터를 여러 번 읽어도 동일한 결과 보장
- 방지하는 부작용: Dirty Read, Non-Repeatable Read
- MySQL InnoDB의 기본 격리 수준
SERIALIZABLE
- 트랜잭션을 완전히 분리해서 순차적으로 실행하는 것과 같은 결과 보장
- 방지하는 부작용: Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지
- 가장 안전하지만 동시성이 낮아 성능이 떨어짐
어떤 격리 수준을 사용해야할까?
- 부작용이 전혀 발생하지 않는 SERIALIZABLE가 좋을 것 같지만 동시에 처리할 수 있는 작업량이 떨어진다.
- 너무 낮은 격리 수준을 선택하면 데이터의 정합성을 보장할 수 없기 때문에 적절한 기준을 선택해야한다.
반응형