2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

트랜잭션 격리 수준 / 전파 레벨

2024. 12. 3. 01:56ㆍ자바
트랜잭션 격리 수준 (Transaction Isolation Level)
  • 개념
    • 트랜잭션 격리 수준은 데이터베이스가 트랜잭션 간의 동시성과 데이터 정합성을 관리하기 위해 사용하는 설정
    • 하나의 트랜잭션이 다른 트랜잭션의 작업에 영향을 미치지 않도록 하여 무결성을 보장하지만, 이 과정에서 동시성을 어느 정도까지 희생할지를 정의한다.
    • 격리 수준이 높아질수록 데이터 무결성이 강력히 보장되지만, 시스템 서능은 낮아지고 트랜잭션 처리량이 줄어든다.

  • 트랜잭션 격리 수준의 종류 
    • Read Uncommited (읽기 미완료)
      • 특징
        • 트랜잭션이 커밋되지 않은 데이터도 읽을 수 있다.
        • 데이터 정합성이 보장되지 않은 가장 낮은 격리 수준
      • 허용되는 문제 
        • Dirty Read : 한 트랜잭션에서 커밋되지 않은 데이터를 읽고, 해당 데이터가 롤백될 경우 잘못된 데이터를 읽은 문제가 발생
        • Non-Repeatable Read : 동일 트랜잭션에서 읽은 데이터가 다른 트랜잭션에 의해 수정될 수 있음
        • Phantom Read : 동일 쿼리를 실행했을 때 다른 트랜잭션이 데이터를 삽입/삭제하여 결과가 달라질 수 있음.
      • 장점 
        • 최대의 동시성 제공으로 성능이 뛰어남
      • 단점 
        • 데이터 정합성이 보장되지 않아, 일반적인 트랜잭션 처리 환경에서는 사용되지 않음
      • 적용 예시
        • 데이터 정합성보다 속도가 중요한 로그 처리나 분석 시스템
    • Read Commited ( 읽기 완료 )
      • 특징
        • 트랜잭션이 커밋된 데이터만 읽을 수 있다.
        • Dirty Read를 방지하지만, Non-Repeatable Read,와 Phantom Read는 여전히 발생할 수 있다.
      • 허용되는 문제
        • Non-Repeatable Read : 동일 트랜잭션 내에서 읽은 데이터가 다른 트랜잭션에 의해 변경될 수 있음
        • Phantom Read : 결과 집합에 새로운 행이 나타날 수 있음
      • 장점 :
        • 성능과 데이터 정합성 간의 균형을 제공
        • Dirty Read를 방지해 안전성이 높은 데이터 처리 가능
      • 단점
        • 데이터가 트랜잭션 도중 변경될 가능성이 있으므로, 모든 일관성 요구를 충족시키지는 못함
      • 적용 예시
        • Oracle과 SQL Server에서 기본적으로 사용
    • Repeatable Read ( 반복 읽기 )
      • 특징
        • 동일 트랜잭션에서 읽은 데이터는 트랜잭션 완료 시까지 동일한 상태를 유지
        • Non-Repeatable Read를 방지하며, 읽기 작업에서 더 높은 일관성을 유지
      • 허용되는 문제
        • Phantom Read : 동일 트랜잭션에서 동일한 조건으로 데이터를 조회했지만, 결과 집합이 다른 트랜잭션의 삽입/ 삭제로 달라질 가능성
      • 장점 : 
        • 데이터 읽기의 일관성이 높아지며, 대부분의 실시간 트랜잭션 처리에 적합
      • 단점 :
        • 동시성이 다소 제한되어, 시스템 부하가 증가할 수 있음
      • 적용 예시 :
        • MySQL InnoDB의 기본 격리 수준
    • Serializeble ( 직렬화 가능 )
      • 특징 : 
        • 모든 트랜잭션이 직렬적으로 실행된 것처럼 보장
        • 동시성을 최소화하고, 가장 높은 수준의 데이터 무결성을 보장
      • 허용되는 문제 :
        • 모든 데이터 정합성 문제가 방지됨 ( Dirty Read, Non-Repeatable Read, Phantom Read 모두 차단 )
      • 장점 : 
        • 데이터 정합성이 가장 강력히 보장됨
        • 비즈니스 논리상 데이터의 변경이나 추가가 매우 민감할 경우 적합
      • 단점 : 
        • 성능 저하 및 병목현상 발생 가능
        • 리소스 사용량이 매우 높다
      • 적용 예시 :
        • 금융 시스템, 의료 데이터베이스와 같이 데이터 정확성이 최우선인 환경

  • 주요 데이터 정합성 문제
문제 설명 방지 수준
Dirty Read 커밋되지 않은 데이터를 읽고, 데이터가 롤백되면 정합성이 깨지는 문제 Read Committed 이상
Non-Repeatable Read 동일 트랜잭션에서 읽은 데이터가 다른 트랜잭션에 의해 변경되어 결과가 달라지는 문제 Repeatable Read 이상
Phantom Read 동일 쿼리를 실행했을 때, 다른 트랜잭션이 데이터를 추가 / 삭제하여 결과 집합이 달라지는 문제 Serializable

트랜잭션 전파 레벨 ( Transactional Propagation Level )
  • 개념
    • 트랜잭션 전파 레벨은 하나의 트랜잭션이 다른 트랜잭션을 호출할 때, 어떻게 상호작용할지를 정의하는 설정.
    • 애플리케이션 계층에서 여러 메서드 간 트랜잭션을 연결하거나 독립적으로 실행할지를 결정한다.
    • 서비스 계층 간 호출에서 트랜잭션 처리 방식에 따라 데이터 정합성과 비즈니스 로직의 일관성을 보장할 수 있다.
    • 주로 Spring Framework에서 선언적 트랜잭션 관리 ( @Transactional)에 사용된다.

  • 트랜잭션 전파 레벨의 종류
    • REQUIRED (기본값)
      • 설명 
        • 상위 트랜잭션이 존재하며 이를 재사용하며, 없으면 새로운 트랜잭션을 생성.
        • 트랜잭션 관리의 기본 설정으로, 대부분 작업에 적합
      • 특징 
        • 중복된 트랜잭션 생성을 방지해 성능을 최적화
        • 상위 트랜잭션과 하위 트랜잭션은 하나의 논리적 트랜잭션으로 처리된다.
        • 상위 트랜잭션에서 오류 발생 시 전체 롤백
      • 적용 예시
        • 일반적인 CRUD 작업
    • REQUIRES_NEW
      • 설명
        • 항상 새로운 트랜잭션을 생성하며, 상위 트랜잭션은 일시 중단.
        • 독립적인 트랜잭션 처리로, 기존 트랜잭션과 논리적으로 완전히 분리
      • 특징 
        • 상위 트랜잭션에서 실패해도 하위 트랜잭션은 영향을 받지 않으며, 그 반대도 마찬가지
        • 추가적인 트랜잭션 컨텍스트 생성으로 성능에 부담을 줄 수 있음
      • 장점 
        • 상위 트랜잭션의 성공 여부와 상관없이 하위 트랜잭션을 보장해야 하는 작업에 적합
      • 단점
        • 트랜잭션 분리로 인해 관리 복잡도가 증가
      • 적용 예시 
        • 로그 기록, 알림 전송 등 메인 트랜잭션과 독립적으로 수행되어야 하는 작업
    • NESTED
      • 설명
        • 상위 트랜잭션 내부에서 서브 트랜잭션을 생성
        • 상위 트랜잭션의 일부로 간주되지만, 독립적으로 롤백할 수 있다.
      • 특징 
        • 서브 트랜잭션이 SAVEPOINT를 사용하여 부분 롤백 가능
        • 상위 트랜잭션이 커밋되기 전까지는 서브 트랜잭션도 커밋되지 않는다.
        • 서브 트랜잭션에서 오류가 발생하더라도 상위 트랜잭션은 계속 진행 가능
      • 장점
        • 대규모 작업에서 실패한 부분만 롤백하고 나머지를 유지할 수 있어 효율적
      • 단점 
        • 데이터베이스가 SAVEPOINT를 지원하지 않으면 사용할 수 없다.
      • 적용 예시
        • 복잡한 비즈니스 로직에서  부분 실패를 처리해야 하는 경우
          (예 : 대량의 데이터 입력 작업 중 일부 데이터만 유효하지 않은 경우 )
    • MANDATORY
      • 설명
        • 상위 트랜잭션이 반드시 존재해야 하며, 없으면 예외 발생
      • 특징
        • 상위 트랜잭션에 강하게 의존하여 독립적인 트랜잭션 실행을 허용하지 않는다.
        • 상위 트랜잭션이 실패하면 하위 트랜잭션도 함께 롤백
      • 장점 
        • 트랜잭션이 반드시 필요한 경우 트랜잭션 일관성을 강제
      • 단점 
        • 상위 트랜잭션이 없는 상태에서 호출하면 실행 불가 (예외 발생)
      • 적용 예시 
        • 트랜잭션을 필수로 요구하는 하위 서비스 호출
    • NOT_SUPPORTED
      • 설명
        • 트랜잭션 없이 작업을 수행하며, 상위 트랜잭션이 있다면 일시 중단
      • 특징
        • 트랜잭션 관리를 완전히 제외하고 작업을 실행
        • 트랜잭션이 필요 없는 작업에서 성능 최적화 가능
      • 장점
        • 트랜잭션이 불필요한 작업 ( 예 : 로그 기록 ) 에 적합
      • 단점
        • 트랜잭션 없이 실행되므로, 데이터 정합성이 보장되지 않는다
      • 적용 예시
        • 로그 기록, 캐싱
    • NEVER
      • 설명
        • 트랜잭션이 존재하면 예외를 발생시키며, 반드시 트랜잭션 없이 실행해야 한다.
      • 특징
        • 트랜잭션 사용이 엄격히 금지된 작업에만 사용
      • 장점
        • 트랜잭션 간섭 없이 완전 독립적으로 작업 수행 가능
      • 단점
        • 트랜잭션이 존재할 경우 실행 불가
      • 적용 예시
        • 트랜잭션이 불필요하거나 부적절한 단순한 작업
    • SUPPORTS
      • 설명
        • 상위 트랜잭션이 존재하면 이를 사용하고, 없으면 트랜잭션 없이 실행
      • 특징
        • 트랜잭션 유무에 따라 유연하게 동작
        • 주로 트랜잭션 필요성이 낮은 메서드에 사용
      • 장점
        • 트랜잭션 의존성이 낮아 유연한 처리가 가능
      • 단점
        • 트랜잭션이 없는 상태에서는 데이터 정합성이 보장되지 않을 수 있다.
      • 적용 예시
        • 트랜잭션 유무에 따라 처리 방식이 달라도 되는 작업

 

'자바' 카테고리의 다른 글

Persistence Context  (1) 2024.12.12
Persistence Cascade와 Cascade Lifecycle  (0) 2024.12.12
자바 백엔드 면접질문 정리.  (0) 2024.08.28
Optional / Java 도서관 관리 프로그램  (0) 2024.08.23
[TIL] 2024.08.14 [Java/Spring]  (0) 2024.08.16