IT 개발 라이프/DB

트랜잭션 격리 수준(Transaction Isolation Level)

10Biliion 2025. 1. 20. 18:46

 

 

 

 

 

 

 

 

 

데이터베이스 트랜잭션은 여러 작업을 하나의 논리적 단위로 묶어 처리합니다. 이러한 트랜잭션은 일관성 있는 데이터 상태를 유지하고, 동시에 여러 사용자가 데이터를 처리하는 환경에서 문제를 방지하기 위해 격리(isolation)를 필요로 합니다. 트랜잭션 격리 수준은 여러 트랜잭션 간의 격리 정도를 설정하는 기준이며, 이로 인해 발생할 수 있는 문제를 완화하거나 방지할 수 있습니다.


 

1. 트랜잭션 격리 수준의 종류

SQL 표준에서는 트랜잭션 격리 수준을 다음 네 가지로 정의합니다:

  1. READ UNCOMMITTED
  2. READ COMMITTED
  3. REPEATABLE READ
  4. SERIALIZABLE

각 수준은 트랜잭션 간에 발생할 수 있는 Dirty Read, Non-Repeatable Read, Phantom Read 문제를 방지하는 정도가 다릅니다.

 


 

2. 트랜잭션 간 발생 가능한 문제

  1. Dirty Read (더티 리드)
    • 한 트랜잭션이 커밋되지 않은 다른 트랜잭션의 데이터를 읽는 상황.
    • 예: 트랜잭션 A가 데이터를 수정하고 커밋하지 않은 상태에서 트랜잭션 B가 해당 데이터를 읽는 경우.
  2. Non-Repeatable Read (반복 불가능한 읽기)
    • 동일한 트랜잭션 내에서 같은 데이터를 두 번 읽을 때, 데이터 값이 변경되는 상황.
    • 예: 트랜잭션 A가 데이터를 읽은 후, 트랜잭션 B가 데이터를 수정 및 커밋하면, 트랜잭션 A가 다시 읽을 때 다른 값이 반환됨.
  3. Phantom Read (팬텀 리드)
    • 동일한 트랜잭션 내에서 같은 조건으로 데이터를 조회할 때, 레코드의 수가 달라지는 상황.
    • 예: 트랜잭션 A가 특정 조건으로 데이터를 조회한 후, 트랜잭션 B가 새로운 데이터를 삽입하면 트랜잭션 A가 다시 조회할 때 결과가 달라짐.

 


 

3. 각 격리 수준의 특징

1) READ UNCOMMITTED

  • 특징: 가장 낮은 격리 수준으로, 트랜잭션이 커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있음.
  • 장점: 성능이 가장 우수함.
  • 단점: Dirty Read, Non-Repeatable Read, Phantom Read 모두 발생 가능.

2) READ COMMITTED

  • 특징: 트랜잭션이 커밋된 데이터만 읽을 수 있음.
  • 장점: Dirty Read 방지.
  • 단점: Non-Repeatable Read, Phantom Read 발생 가능.
  • 사용 예: 대부분의 RDBMS에서 기본 격리 수준으로 사용.

3) REPEATABLE READ

  • 특징: 트랜잭션이 시작되기 전에 커밋된 데이터만 읽을 수 있으며, 트랜잭션이 완료될 때까지 다른 트랜잭션이 데이터를 수정할 수 없음.
  • 장점: Dirty Read, Non-Repeatable Read 방지.
  • 단점: Phantom Read 발생 가능.
  • 사용 예: InnoDB(사용 MySQL)에서 기본 격리 수준.

4) SERIALIZABLE

  • 특징: 가장 높은 격리 수준으로, 모든 트랜잭션이 직렬적으로 실행되는 것처럼 동작함.
  • 장점: Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지.
  • 단점: 성능 저하, 동시성 감소.
  • 사용 예: 높은 데이터 일관성이 요구되는 경우.

 


 

4. 트랜잭션 격리 수준과 성능

트랜잭션 격리 수준이 높아질수록 데이터의 일관성은 증가하지만 성능은 저하될 수 있습니다.

  • READ UNCOMMITTED: 가장 높은 성능, 가장 낮은 일관성.
  • SERIALIZABLE: 가장 낮은 성능, 가장 높은 일관성.

격리 수준 선택은 애플리케이션의 요구 사항에 따라 결정되며, 데이터의 무결성과 성능 간의 균형을 고려해야 합니다.

 


 

5. Oracle의 기본 트랜잭션 격리 수준

Oracle Database는 READ COMMITTED를 기본 트랜잭션 격리 수준으로 사용합니다. 대부분의 애플리케이션에서 성능과 데이터 무결성 간의 균형을 맞추는 데 적합합니다. Oracle에서는 멀티버전 일관성(MVCC, Multi-Version Concurrency Control)을 사용하여 높은 성능과 일관성을 동시에 제공합니다.

 


 

6. 트랜잭션 격리 수준 설정

Oracle에서 트랜잭션 격리 수준 설정

-- 세션 단위로 설정
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;

-- 트랜잭션 단위로 설정
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

JDBC에서 트랜잭션 격리 수준 설정

Connection connection = dataSource.getConnection();
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);