본문 바로가기

Java/Spring

@Transactional Attribute

스프링에서 트랜잭션을 관리하는 방법은 크게 세 가지로 나누어진다. 애너테이션 @Transactional을 사용하는 방법, AOP를 이용하여 트랜잭션을 관리하는 방법, 프로그래밍으로 직접 제어하는 방법 등이다. 애너테이션 @Transactional의 경우 기본 동작을 재정의하는 데 사용할 수 있는 여러 애트리뷰트를 제공하고 있다.

 

propagation

트랜잭션의 전파를 의미하는 propagation은 값으로 Propagation enum에 정의된 REQUIRED, SUPPORTS, MANDATORY, REQUIRES_NEW, NOT_SUPPORTED, NEVER, NESTED 등을 입력받을 수 있다. 이 값들이 의미하는 바는 다음과 같다.

전파유형 설명
REQUIRED 이미 존재하는 트랜잭션을 지원. 트랜잭션이 없으면 새 트랜잭션을 시작.
SUPPORTS 이미 존재하는 트랜잭션을 지원. 트랜잭션이 없으면 비트랜잭션으로 실행.
MANDATORY 이미 존재하는 트랜잭션을 지원. 진행 중인 트랜잭션이 없으면 예외를 던짐.
REQUIRES_NEW 항상 새로운 트랜잭션을 시작. 진행 중인 트랜잭션이 있다면 해당 트랜잭션은 일시적으로 중단.
NOT_SUPPORTED 진행 중인 트랜잭션과 함께 실행 불가. 항상 비트랜잭션으로 실행하고 기존 트랜잭션은 일시 중단.
NEVER 진행 중인 트랜잭션이 있더라도 항상 비트랜잭션으로 실행. 진행 중인 트랜잭션이 있는 경우 예외 던짐.
NESTED 진행 중인 트랜잭션이 있는 경우 중첩으로 실행. 진행중인 것이 없으면 REQUIRES_NEW와 동일.

 

isolation

격리수준을 의미하는 isolation은 Isolation enum에 정의된 DEFAULT, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE 등을 값으로 받을 수 있다. DEFAULT는 사용하고 있는 DBMS에서 갖고 있는 기본적인 격리 수준을 의미하며, 나머지는 일반적으로 이해하고 있는 격리 수준에서 벗어나지 않는다.

 

timeout

timeout은 트랜잭션을 실행하는데 허용되는 최대 시간을 의미하는 것으로 지정된 시간보다 오랜 시간동안 트랜잭션이 유지되는 경우 롤백된다. DEFAULT 값은 -1로 타임아웃을 적용하지 않는 것을 의미한다.

 

readOnly

트랜잭션이 읽기 전용으로 작동할 것인지 쓰기도 가능한지를 설정한다. 값으로 true, false의 boolean 타입을 갖는다.

 

rollbackFor

트랜잭션을 롤백하는 예외 클래스를 값으로 받으며, 트랜잭션 내에서 해당 exception이 발생하는 경우 rollback 된다.

 

rollbackForClassName

위와 동일하게 작동하는 설정이지만 값으로 클래스 이름을 받는다.

 

noRollbackFor

위의 rollbackFor와 반대로 트랜잭션이 롤백되지 않는 예외 클래스를 의미한다.

 

norollbackForClassName

norollbackFor와 동일한 역할을 하지만 클래스 이름을 값으로 받는다.

 

value

지정된 트랜잭션의 한정자(qualifier) 값을 의미하며, 트랜잭션 매니저가 여러 개 존재하는 경우 어떤 트랜잭션 매니저를 사용할 것인지 나타낸다.

 

@Transactional을 선언하고 설정 값을 선택하지 않는 경우 기본적으로 propagation은 REQUIRED, isolation은 DEFAULT, timeout은 DEFAULT, readOnly는 false가 되어 read-wrtite를 모두 허용한다.

 

참고자료

전문가를 위한 스프링 5