개요
관계형 데이터베이스 관리 시스템(RDBMS)에서는 데이터의 일관성과 무결성을 유지하기 위해 트랜잭션의 격리 수준(Transaction Isolation Level)을 설정한다. 트랜잭션 격리 수준은 동시에 실행되는 여러 트랜잭션 간의 상호작용을 제어하여 다양한 이상 현상을 방지한다. 본 글에서는 주요 데이터베이스 이상 현상과 표준 SQL 기준의 트랜잭션 격리 수준에 대해 고찰한다.
내용
Dirty Read (더티 리드)
한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경된 데이터를 읽는 현상이다. 만약 변경된 데이터가 롤백되면, 읽은 데이터는 유효하지 않게 된다.
- 트랜잭션 A가 데이터 X의 값을 100에서 200으로 변경하지만 아직 커밋하지 않았다.
- 트랜잭션 B가 데이터 X의 값을 읽을 때 200을 읽는다.
- 트랜잭션 A가 롤백되면, 데이터 X는 다시 100으로 돌아가지만 트랜잭션 B는 잘못된 값을 참조하게 된다.
Non-Repeatable Read (비반복 읽기)
한 트랜잭션이 동일한 데이터를 두 번 이상 읽을 때, 그 사이에 다른 트랜잭션에 의해 데이터가 변경되어 서로 다른 값을 읽게 되는 현상이다.
- 트랜잭션 A가 데이터 Y의 값을 처음에 50으로 읽는다.
- 트랜잭션 B가 데이터 Y의 값을 50에서 60으로 업데이트하고 커밋한다.
- 트랜잭션 A가 다시 데이터 Y의 값을 읽을 때 60을 읽게 된다.
Phantom Read (팬텀 리드)
한 트랜잭션이 동일한 조건으로 여러 번 데이터를 조회할 때, 그 사이에 다른 트랜잭션에 의해 새로운 데이터가 삽입되거나 삭제되어 조회 결과에 변화가 생기는 현상이다.
- 트랜잭션 A가 "가격 > 100"인 상품을 조회하여 10개를 얻는다.
- 트랜잭션 B가 새로운 상품을 추가하여 "가격 > 100" 조건을 만족시킨다.
- 트랜잭션 A가 다시 "가격 > 100"인 상품을 조회할 때, 총 11개의 상품을 얻게 된다.
Isolation Level (표준 SQL 기준)
트랜잭션 격리 수준은 여러 트랜잭션이 동시에 실행될 때 발생할 수 있는 이상 현상을 제어하는 정도를 정의한다. 표준 SQL은 네 가지 주요 격리 수준을 제공한다.
- Read Uncommitted
- 가장 낮은 격리 수준으로, 트랜잭션이 아직 커밋되지 않은 데이터를 읽을 수 있다.
- 모든 이상 현상이 발생할 수 있다.
- Read Committed
- 트랜잭션이 커밋된 데이터만 읽을 수 있다.
- Dirty Read는 방지되지만 Non-Repeatable Read와 Phantom Read는 발생할 수 있다.
- Repeatable Read
- 트랜잭션이 시작된 이후로 다른 트랜잭션이 데이터를 변경하지 못하게 한다.
- Non-Repeatable Read는 방지되지만 Phantom Read는 발생할 수 있다.
- Serializable
- 트랜잭션이 완전히 직렬화된 것처럼 동작하여 모든 이상 현상을 방지한다.
- 가장 높은 격리 수준으로, 동시성은 낮아질 수 있다.
각 Isolation Level에 따른 이상 현상 발생 여부
참고 자료