Java

@Transactional 란?

솔솔 2023. 5. 1. 10:55
반응형

@Transactional
메서드나 클래스에 적용되어 해당 메서드나 클래스에서 수행되는 모든 작업을 하나의 트랜잭션으로 묶어주는 역할
해당 메서드나 클래스에서 수행된 작업 중 어떤 하나라도 실패하는 경우, 모든 작업이 취소되어 데이터 일관성이 유지된다.

Transaction ACID
1) 원자성 (Atomicity)
- 한 트랜잭션 내에서 실행한 작업들은 하나의 단위로 처리
    - 모두 성공하거나 모두 실패
    
2) 일관성 (Consistency)
- 트랜잭션은 일관성 있는 데이터베이스 상태를 유지
    
3) 격리성 (Isolation)
- 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리
    
4) 영속성 (Durability)
- 트랜잭션을 성공적으로 마치면 결과가 항상 저장
    
@ 애너테이션 속성
* 접근제어자가 private / protected 일 경우 @Transactional을 무시한다. 

1. Isolation Level

@Transactional( isolation = Isolation.XX )


트랙잭션에서 일관성없는 데이터 허용 수준을 설정

 1) DEFAULT
  - DBMS의 기본 격리 수준 적용
    
 2) READ_UNCOMMITED (level0)
  - 트랜잭션의 동시 액세스 허용
    - Postgres는 미지원, Oracle은 지원하거나 허용하지 않음
    - 세가지 동시성 부작용이 모두 발생
    => Dirty read, Non repeatable read, Phamtom read
    * Dirty read란, 다른 트랜잭션이 아직 커밋되지 않은 데이터를 읽을 수 있는 현상 (데이터 불일치)
    * Non-repeatable read란, 동일한 트랜잭션 내에서 같은 쿼리를 두번 이상 실행할 때 결과 값이 다른 현상
    * Phamtom read란, 동일한 쿼리를 실행할 때 결과 값이 다른 현상
 
 3) READ_COMMITED (level1)
  - Dirty read 방지
    - Postgres, SQL, Server 및 Oracle의 기본 수준
    - 동시성 부작용 여전히 발생
     => Non repeatable read, Phamtom read
 
 4) REPEATABLE_READ (level2)
  - Dirty read, Non repeatable read 방지
    - 업데이트 손실을 방지하기 위해 필요한 가장 낮은 수준 (동시 액세스 허용하지 않음)
    - 동시성 부작용 여전히 발생
     => Phamtom read
    - MySQL의 기본 수준, Oracle은 미지원
 
 5) SERIALIZABLE (level3)
  - 가장 높은 격리 수준이지만, 동시 호출을 순차적으로 실행하므로 성능 저하의 우려
    - 모든 부작용을 방지

2. Propagation

@Transactional( propagation = Propagation.XX )

동작 도중 다른 트랜잭션을 호출할 때 어떻게 할 것인지 지정하는 옵션

 1) REQUIRED (default)
  - 활성 트랜잭션이 있는지 확인하고, 아무것도 없으면 새 트랜잭션을 생성


 2) SUPPORTS
  - 활성 트랜잭션이 있는지 확인하고, 있으면 기존 트랜잭션 사용 없으면 트랜잭션 없이 실행


 3) REQUIRED_NEW
  - 현재 트랜잭션이 존재하는 경우, 현재 트랜잭션을 일시 중단하고 새 트랜잭션 생성


 4) MANDATORY
  - 활성 트랜잭션이 있으면 사용하고 없으면 예외발생
    - 독립적으로 트랜잭션을 진행하면 안되는 경우 사용


 5) NOT_SUPPORTED
  - 현재 트랜잭션이 존재하면 트랜잭션을 일시 중단한 다음 트랜잭션없이 비즈니스 로직 실행


 6) NAVER
  - 활성 트랜잭션이 있으면 예외 발생
    - 트랜잭션을 사용하지 않도록 제어할 경우


 7) NESTED
  - 트랜잭션이 존재하는지 확인하고 존재하는 경우 저장점을 표시
    - 비즈니스 로직 실행에서 예외가 발생하면 트랜잭션이 이 저장 지점으로 롤백
    - 활성 트랜잭션이 없으면 REQUIRED_NEW 처럼 작동

3. Timeout

@Transactional( timeout = 10 )

지정한 시간 내에 메서드 수행이 완료되지 않으면 rollback되도록 설정
단위 : second
-1일 경우 no timeout (default : -1)

4. ReadOnly

@Transactional( readOnly = true )

트랜잭션을 읽기 전용으로 설정
readOnly = true인 경우 INSERT UPDATE DELETE 작업 진행 시 예외 발생
default : false

5. Rollback
선언적 트랜잭션에서는 런타임 예외가 발생하면 롤백 수행
예외가 발생하지 않거나 체크 예외 발생시 커밋
rollbackFor옵션으로 기본 동작방식 변경 가능

1) noRollbackFor
     @Transactional( rollbackFor = Exception.class )
     - 특정 예외 발생 시 rollback이 동작하지 않도록 설정


2) rollbackFor
     @Transactional( noRollbackFor = Exception.class )
     - 특정 예외 발생 시 rollback이 동작하도록 설정

반응형