[Spring] @Transactional

@Transactional

@Transacitonal 애노테이션으로 포인트컷과 트랜잭션 속성을 지정할 수 있다

트랜잭션 대체 정책

@Transactional 애노테이션을 통해 트랜잭션을 수행할 때 적용되는 트랜잭션 정책이다
다음과 같은 순서로 우선순위를 가지며 먼저 발견되는 속성 정보를 사용한다

  1. 타깃 메소드
  2. 타깃 클래스
  3. 인터페이스 메소드
  4. 인터페이스 타입

트랜잭션 전파

트랜잭션 전파란 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식이다

REQUIRED

Default
진행 중인 트랜잭션이 없으면 새로 시작하고 이미 시작된 트랜잭션이 있으면 이에 참여한다
즉 트랜잭션이 이미 시작된 상태에서 REQUIRED 속성을 가진 메소드의 호출이 발생할 때 기존 트랜잭션이 그대로 전파돼서 하나의 트랜잭션으로 통합된다

REQUIRES_NEW

항상 새로운 트랜잭션을 시작한다

NOT_SUPPORTED

트랜잭션이 없이 동작한다

SUPPORTS

이미 시작된 트랜잭션이 있으면 참여하고 시작된 트랜잭션이 없으면 트랜잭션 없이 수행한다

MANDATORY

이미 시작된 트랜잭션이 있으면 참여하고 없으면 예외를 발생시킨다

NEVER

트랜잭션을 사용하지 않도록 한다
이미 진행 중인 트랜잭션이 있으면 예외를 발생시킨다

NESTED

이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작한다
중첩된 트랜잭션은 부모 트랜잭션의 롤백과 커밋에 영향을 주지 않는다


isolation

Default

DB의 Isolation Level을 따른다

1
@Transactional(isolation=Isolation.Default)


READ_UNCOMMITTED

트랜잭션 처리중인 데이터에 대한 읽기를 허용한다

READ_COMMMITTED

트랜잭션이 커밋 된 데이터만 읽기를 허용한다

REPETABLE_READ

트랜잭션이 완료될 때 까지 SELECT문이 접근하는 모든 데이터에 shared lock이 걸린다

SERIALIZABLE

트랜잭션이 완료될 때 까지 SELECT문이 접근하는 모든 데이터에 exclusive lock이 걸린다


rollback

rollbackFor

특정 예외 발생시 강제로 롤백 시킨다

1
@Transactional(rollbackFor=Exception.class)

noRollbackFor

특정 예외 발생 시 롤백하지 않는다


timeout

지정 시간 내에 메소드가 완료되지 않을 경우 롤백을 수행한다
Default는 -1이다

1
@Transactional(timeout=30)



readOnly

트랜잭션을 읽기 전용으로 설정한다

1
@Transactional(readOnly=true)


트랜잭션 전파를 통한 트랜잭션 수행 시 트랜잭션 속성 중 읽기전용과 제한시간은 처음 트랜잭션이 시작될 때만 적용된다
즉, readOnly 트랜잭션을 수행하면서 Write를 수행하는 코드를 호출할 경우 TransientDataAccessResourceException이 발생한다

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/07/07/Spring/transactional/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.