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

Kkd·2024년 11월 26일
0

매일메일 개념정리

목록 보기
9/93

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

트랜잭션 격리 수준은 여러 트랜잭션이 동시에 수행될 때, 데이터 무결성과 일관성을 보장하기 위해 트랜잭션 간의 상호작용을 제어하는 규칙입니다.
SQL 표준에서는 트랜잭션 격리 수준을 4단계로 정의하며, 각 수준은 데이터의 일관성(Consistency)동시성(Concurrency) 사이의 균형을 달리합니다.


1. 격리 수준의 필요성

격리 수준은 동시성 제어 문제를 해결하기 위해 사용됩니다. 트랜잭션이 동시에 실행될 때 발생할 수 있는 문제는 다음과 같습니다:

  1. Dirty Read (더티 리드)
    • 한 트랜잭션이 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 경우.
  2. Non-Repeatable Read (반복 불가능한 읽기)
    • 한 트랜잭션이 동일한 데이터를 두 번 읽을 때, 중간에 다른 트랜잭션이 해당 데이터를 수정하거나 삭제하여 결과가 달라지는 경우.
  3. Phantom Read (팬텀 리드)
    • 한 트랜잭션이 동일한 조건으로 여러 번 데이터를 조회할 때, 중간에 다른 트랜잭션이 새로운 데이터를 삽입하여 결과에 영향을 주는 경우.

2. 격리 수준의 종류

(1) READ UNCOMMITTED (읽기 미완료 허용)

  • 특징:
    • 다른 트랜잭션이 아직 커밋되지 않은 변경 내용도 읽을 수 있음.
    • 동시성은 가장 높지만, 무결성과 일관성은 보장되지 않음.
  • 허용되는 문제:
    • Dirty Read, Non-Repeatable Read, Phantom Read.
  • 사용 사례:
    • 성능이 매우 중요한 상황에서 데이터 일관성이 덜 중요한 경우.

(2) READ COMMITTED (읽기 완료 허용)

  • 특징:
    • 커밋된 데이터만 읽을 수 있음.
    • 한 트랜잭션이 읽은 데이터가 중간에 다른 트랜잭션에 의해 수정될 수 있음.
  • 허용되는 문제:
    • Non-Repeatable Read, Phantom Read.
  • 사용 사례:
    • 대부분의 데이터베이스의 기본 격리 수준 (예: Oracle).

(3) REPEATABLE READ (반복 가능 읽기)

  • 특징:
    • 한 트랜잭션이 같은 데이터를 여러 번 읽어도 결과가 동일함.
    • Phantom Read는 발생할 수 있음.
    • MySQL의 기본 격리 수준.
  • 허용되는 문제:
    • Phantom Read.
  • 사용 사례:
    • 높은 일관성이 필요한 상황, 하지만 완벽한 격리는 필요 없는 경우.

(4) SERIALIZABLE (직렬화 가능)

  • 특징:
    • 트랜잭션이 순차적으로 실행되는 것처럼 보임.
    • 완벽한 격리를 보장하며, 모든 문제(Dirty Read, Non-Repeatable Read, Phantom Read)를 방지.
    • 가장 낮은 동시성과 높은 성능 오버헤드.
  • 허용되는 문제:
    • 없음.
  • 사용 사례:
    • 데이터의 일관성이 절대적으로 중요한 상황 (예: 은행 계좌 이체).

3. 격리 수준과 동시성 제어

격리 수준Dirty ReadNon-Repeatable ReadPhantom Read
READ UNCOMMITTED허용허용허용
READ COMMITTED방지허용허용
REPEATABLE READ방지방지허용
SERIALIZABLE방지방지방지

Dirty Read는 한 트랜잭션이 다른 트랜잭션이 변경 중인 데이터를 읽는 경우 발생합니다. 다른 트랜잭션이 아직 커밋되지 않은 (즉, 롤백할 가능성이 있는) 데이터를 읽어서, 그 데이터가 나중에 롤백될 경우 트랜잭션의 결과가 변경될 수 있습니다. 이는 데이터의 일관성을 깨뜨릴 수 있습니다.

Non-Repeatable Read는 같은 트랜잭션 안에서 동일한 쿼리를 실행했을 때, 다른 결과를 얻는 경우를 의미합니다. 예를 들어, 한 트랜잭션이 같은 데이터를 두 번 읽을 때, 첫 번째 읽기와 두 번째 읽기 사이에 다른 트랜잭션이 해당 데이터를 변경했을 경우 발생할 수 있습니다.

Phantom Read는 한 트랜잭션이 동일한 쿼리를 두 번 실행했을 때, 두 번의 쿼리 사이에 다른 트랜잭션이 삽입, 갱신, 삭제 등의 작업을 수행하여 결과 집합이 달라지는 경우를 말합니다. 이로 인해 한 트랜잭션 내에서 일관성 없는 결과를 가져올 수 있습니다.


4. 데이터베이스에서의 기본 격리 수준

  • MySQL: REPEATABLE READ (기본값)
  • Oracle: READ COMMITTED (기본값)
  • SQL Server: READ COMMITTED (기본값)
  • PostgreSQL: READ COMMITTED (기본값)

5. 격리 수준 설정 방법

(1) MySQL에서 격리 수준 설정

  • 세션 단위 격리 수준 설정:
    SET SESSION TRANSACTION ISOLATION LEVEL [LEVEL];
  • 글로벌 단위 격리 수준 설정:
    SET GLOBAL TRANSACTION ISOLATION LEVEL [LEVEL];

(2) Spring Boot에서 설정

  • application.properties에서 설정:

    spring.jpa.properties.hibernate.connection.isolation=2  # READ_COMMITTED
  • 코드에서 트랜잭션 격리 수준 지정:

    @Transactional(isolation = Isolation.REPEATABLE_READ)
    public void someMethod() {
        // 트랜잭션 처리 코드
    }

6. 선택 시 고려 사항

  • 데이터 무결성 vs 성능: 높은 격리 수준은 데이터 무결성을 보장하지만, 성능에 영향을 줄 수 있음.
  • 애플리케이션 특성: 데이터 일관성이 중요한 애플리케이션에서는 높은 격리 수준을 선택, 반대로 동시성이 중요하다면 낮은 격리 수준을 선택.

요약

트랜잭션 격리 수준은 데이터베이스의 일관성과 동시성 사이의 균형을 조절하는 중요한 요소입니다. 애플리케이션의 요구사항과 데이터베이스 환경에 따라 적절한 격리 수준을 설정하는 것이 중요합니다.

추가 학습 자료

profile
🌱

0개의 댓글