(RDB) 데이터베이스 이상 현상과 Transaction Isolation Level
개요
관계형 데이터베이스 관리 시스템(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에 따른 이상 현상 발생 여부
참고 자료
Transaction Isolation Levels - JLVBCOOP
Isolation determines how transaction integrity is visible to other users and systems. It means that a transaction should take place in a
jlvbcoop.com