SPRING

[SPRING] 트랜잭션(Transaction)

도원좀비 2025. 5. 9. 21:55

1️⃣ 트랜잭션이란?

트랜잭션은 데이터베이스에서 여러 작업을 하나의 단위로 묶어 처리하는 것
이때 여러 작업이 하나의 트랜잭션으로 처리되어야 하며,모두 성공하거나 모두 실패해야 함

 

✅ 트랜잭션의 특징

  • 원자성(Atomicity): 트랜잭션은 하나의 단위로 처리되며, 모든 작업이 성공하거나 모두 실패
  • 일관성(Consistency): 트랜잭션의 실행 전후로 데이터베이스는 일관성 있는 상태를 유지
  • 격리성(Isolation): 동시에 실행되는 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행
  • 지속성(Durability): 트랜잭션이 완료되면 그 결과는 영구적으로 반영

2️⃣ 트랜잭션 전파 속성(Propagation)

트랜잭션 전파 속성은 트랜잭션이 다른 트랜잭션을 호출할 때 어떻게 동작할지를 정의

 

✅ 전파 속성 종류

1. REQUIRED (기본값)

  • 이미 진행 중인 트랜잭션이 있으면 그 트랜잭션을 사용하고, 없으면 새로운 트랜잭션을 시작
  • 대부분의 경우 이 속성을 사용

 

2. REQUIRES_NEW

  • 항상 새로운 트랜잭션을 시작합니다. 기존 트랜잭션이 있더라도, 현재 메서드는 새로운 트랜잭션을 시작하고 이전 트랜잭션과 독립적으로 동작

 

3. NESTED

  • 이미 진행 중인 트랜잭션이 있으면 그 트랜잭션 내에서 중첩된 트랜잭션을 생성합니다. 중첩된 트랜잭션은 독립적으로 커밋하거나 롤백할 수 있음
  • 주 트랜잭션이 커밋될 때 중첩된 트랜잭션도 함께 커밋되거나 롤백

 

4. SUPPORTS

  • 현재 트랜잭션이 있으면 그 트랜잭션을 사용하고, 없으면 트랜잭션 없이 실행

 

5. NOT_SUPPORTED

  • 트랜잭션 없이 실행됩니다. 만약 이미 트랜잭션이 진행 중이라면 이를 일시적으로 중단하고 트랜잭션 없이 실행

 

6. MANDATORY

  • 반드시 기존의 트랜잭션이 존재해야 합니다. 트랜잭션이 없으면 예외를 발생

 

7. NEVER

  • 트랜잭션이 존재해서는 안 됩니다. 트랜잭션이 존재하면 예외를 발생

3️⃣ 트랜잭션 격리 수준(Isolation)

트랜잭션 격리 수준은 동시 실행되는 트랜잭션들이 서로 간섭하지 않도록 보장하는 방법을 정의
격리 수준에 따라 Dirty Read, Non-repeatable Read, Phantom Read 등의 현상이 발생

 

✅ 격리 수준 종류

1. READ_UNCOMMITTED

 

  • 가장 낮은 격리 수준으로, 다른 트랜잭션이 커밋하지 않은 데이터도 읽을 수 있다.
  • Dirty Read 현상이 발생할 수 있다.

 

2. READ_COMMITTED

  • 커밋된 데이터만 읽을 수 있습니다. 다른 트랜잭션이 커밋한 데이터만 읽음
  • Non-repeatable Read 현상이 발생할 수 있음

 

3. REPEATABLE_READ

  • 트랜잭션 내에서 한 번 읽은 데이터는 다시 읽을 때 동일한 값이 보장됩니다. 다른 트랜잭션이 값을 수정할 수 없음
  • Phantom Read 현상이 발생할 수 있음

 

4. SERIALIZABLE

  • 가장 높은 격리 수준으로, 트랜잭션들이 순차적으로 실행되는 것처럼 보입니다. 다른 트랜잭션이 값을 수정하거나 추가 X
  • Phantom Read도 방지

4️⃣ 트랜잭션 롤백 규칙(Rollback Rules)

트랜잭션이 실패할 경우, 트랜잭션을 롤백하여 이전 상태로 되돌려야 합니다. @Transactional 어노테이션은 롤백 규칙을 설정할 수 있다.

  • 기본 롤백 규칙: 트랜잭션이 런타임 예외(RuntimeException)가 발생하면 롤백
  • 롤백 예외 지정: rollbackFor 속성을 사용하여 특정 예외에 대해서 롤백을 지정할 수 있음
@Transactional(rollbackFor = Exception.class)
public void methodL() throws Exception {
    // 예외가 발생하면 롤백
}