[JPA] 트랜잭션

트랜잭션의 ACID 속성

1. 원자성(Atomicity)

  • 트랜잭션 내의 모든 작업은 하나로 간주된다.
  • 트랜잭션안의 작업은 모두 성공하거나, 모두 실패해야한다..

2. 일관성 (Consistency)

  • 트랜잭션이 실행되기 전과 후에 DB 의 상태는 일관되어야 함.
  • 예시
    • 데이터베이스 무결성 제약조건이 항상 충족되어야 함.

3. 격리성 (Isolation)

  • 동시에 수행되는 여러 트랜잭션이 서로 영향을 주지 않도록 격리
  • 다른 트랜잭션이 중간 결과에 영향을 받지 않도록 한다.
  • 예시
    • @Transcational isolation 속성 ..

4. 지속성 (Durability)

  • 트랜잭션이 성공적으로 완료되면,
  • 이후에 발생하는 시스템 장애나 오류에도 영향을 받지 않고 영구적으로 저장된다.

ANSI 표준 4 가지 트랜잭션 격리 수준

  1. READ UNCOMMITTED( 커밋되지 않은 읽기 )
    1. 가장 낮은 격리
    1. 다른 트랜잭션이 커밋하지 않은 데이터를 읽을 수 있음.
    1. 더티 리드 문제 발생!

    위 사진은 커밋되지 않은 읽기를 격리단계로 사용시의 케이스와 그에 따른 문제점이다

  1. READ_COMMITTED ( 커밋된 내역 읽기 )
    1. 커밋된 데이터만 읽을 수 있다.
    1. 더티 리드 방지
    1. 하지만, 논리피트 리드(Non-repeated Read) 는 여전히 발생한다.

    위 사진은 커밋된 데이터를 읽는 격리단계의 경우의 케이스이다.

    커밋된 데이터만 읽게 되는 것이다.

  1. REPEATABLE_READ ( 반복된 읽기가 가능한 격리 )
    • 트랜잭션 내의 일관된 데이터의 읽기를 조회한다.
      • 즉, 트랜잭션 내에서 동일한 쿼리를 반복해서 날리면,
      • 결과가 항상 동일하게 조회된다.
    • 금융 도메인의 경우 해당 격리단계가 매우 중요하다.
    • 하지만, 팬텀 리드는 발생할 수 있다.

    위 사진은 반복된 읽기가 설정되지 않은 경우 어떤 DB 정합성위반이 발생할 수 있는지 그 위험에 대한 케이스이다.

    반복 읽기를 설정한 경우

  1. SERIALIZABLE
    • 모든 트랜잭션이 격리되어 수행된다.
    • 트랜잭션이 순차적으로 수행되며 멀티스레드의 이점을 누릴 수 없게된다.
    • 격리수준의 문제때문에 동시 처리 능력이 최악이다..

Uploaded by N2T