트랜잭션 격리 수준은 여러 트랜잭션이 동시에 수행될 때, 데이터 무결성과 일관성을 보장하기 위해 트랜잭션 간의 상호작용을 제어하는 규칙입니다.
SQL 표준에서는 트랜잭션 격리 수준을 4단계로 정의하며, 각 수준은 데이터의 일관성(Consistency)과 동시성(Concurrency) 사이의 균형을 달리합니다.
격리 수준은 동시성 제어 문제를 해결하기 위해 사용됩니다. 트랜잭션이 동시에 실행될 때 발생할 수 있는 문제는 다음과 같습니다:
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
---|---|---|---|
READ UNCOMMITTED | 허용 | 허용 | 허용 |
READ COMMITTED | 방지 | 허용 | 허용 |
REPEATABLE READ | 방지 | 방지 | 허용 |
SERIALIZABLE | 방지 | 방지 | 방지 |
Dirty Read는 한 트랜잭션이 다른 트랜잭션이 변경 중인 데이터를 읽는 경우 발생합니다. 다른 트랜잭션이 아직 커밋되지 않은 (즉, 롤백할 가능성이 있는) 데이터를 읽어서, 그 데이터가 나중에 롤백될 경우 트랜잭션의 결과가 변경될 수 있습니다. 이는 데이터의 일관성을 깨뜨릴 수 있습니다.
Non-Repeatable Read는 같은 트랜잭션 안에서 동일한 쿼리를 실행했을 때, 다른 결과를 얻는 경우를 의미합니다. 예를 들어, 한 트랜잭션이 같은 데이터를 두 번 읽을 때, 첫 번째 읽기와 두 번째 읽기 사이에 다른 트랜잭션이 해당 데이터를 변경했을 경우 발생할 수 있습니다.
Phantom Read는 한 트랜잭션이 동일한 쿼리를 두 번 실행했을 때, 두 번의 쿼리 사이에 다른 트랜잭션이 삽입, 갱신, 삭제 등의 작업을 수행하여 결과 집합이 달라지는 경우를 말합니다. 이로 인해 한 트랜잭션 내에서 일관성 없는 결과를 가져올 수 있습니다.
SET SESSION TRANSACTION ISOLATION LEVEL [LEVEL];
SET GLOBAL TRANSACTION ISOLATION LEVEL [LEVEL];
application.properties
에서 설정:
spring.jpa.properties.hibernate.connection.isolation=2 # READ_COMMITTED
코드에서 트랜잭션 격리 수준 지정:
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void someMethod() {
// 트랜잭션 처리 코드
}
트랜잭션 격리 수준은 데이터베이스의 일관성과 동시성 사이의 균형을 조절하는 중요한 요소입니다. 애플리케이션의 요구사항과 데이터베이스 환경에 따라 적절한 격리 수준을 설정하는 것이 중요합니다.
추가 학습 자료