241205 TIL - 트랜잭션 격리 수준(Isolation Levels)

J_log·2024년 12월 5일
0

트랜잭션 격리 수준이란?

트랜잭션 격리 수준은 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭셕이 다른 트랜잭션으로부터 얼마나 격리될지를 설정하는 기준이다. 이 격리 수준은 데이터 충돌을 방지하면서도 성능을 조율하는 역할을 한다.
격리 수준이 높아질수록 데이터의 안정성은 높아지지만 동시성(성능)은 낮아질 수 있다.

트랜잭션 격리 수준의 종류

Read Uncommitted
커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있다.
가장 낮은 수준으로, 동시성이 높지만 데이터 일관성 문제가 발생할 수 있다.

  • 발생 가능한 문제
    • Dirty Read : 다른 트랜잭션에서 아직 커밋되지 않은 데이터를 읽음
    • Non-Repeatable Read : 같은 데이터를 두 번 읽었을 때 값이 달라질 수 있음
    • Phantom Read : 동일한 조건의 조회 결과가 달라질 수 있음
  • 데이터 일관성이 크게 중요하지 않은 로그, 분석 작업 등에 사용

Read Committed
커밋된 데이터만 읽을 수 있다. (대부분의 DBMS에서 기본 설정)

  • 발생 가능한 문제
    • Non-Repeatable Read : 동일 데이터를 반복 조회할 때 값이 달라질 수 있음
    • Phantom Read : 쿼리 실행 중 다른 트랜잭션에서 데이터가 추가되거나 삭제될 수 있음
  • 일반적인 애플리케이션(읽기-쓰기 작업 혼합)에 적합

Repeatable Read
트랜잭션 내에서 동일 데이터를 반복해서 읽으면 항상 같은 값을 반환한다.

  • 발생 가능한 문제
    • Phantom Read : 트랜잭션 중간에 다른 트랜잭션이 데이터를 삽입/삭제하면 조회 결과가 달라질 수 있음
  • 재고 관리, 은행 잔고 확인 등 안정적인 읽기가 중요한 시스템에 적합

Serializable
트랜잭션이 마치 하나씩 차례대로 실행되는 것처럼 보이도록 보장한다.
가장 높은 수준으로, 데이터 정확성이 완벽히 보장된다.

  • 발생 가능한 문제
    • 없다 ! (모든 문제 방지 가능) 다만 성능이 많이 떨어질 수 있다.
  • 금융 거래, 대출 시스템 등 데이터 정확성이 최우선인 시스템에 적합

어떻게 선택하면 좋을까?

  1. 성능이 중요하고 데이터 불일치가 큰 문제가 안 된다면 ->
    Read Uncommitted 또는 Read Committed

  2. 읽기 작업의 안정성이 중요하다면 ->
    Repeatable Read

  3. 데이터의 정확성이 최우선이라면 ->
    Serializable


Spring에서 트랜잭션 격리 수준 사용하기

spring에서는 @Transactional 어노테이션으로 트랜잭션 격리 수준을 설정할 수 있다.

@Service
public class StoreService {

    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void performTransaction() {
        // 트랜잭션 코드
    }
}

0개의 댓글