Spring/Annotation

@Transactional

단순대왕 2016. 1. 13. 17:05

트랜잭션 AOP 적용

@Transactional - 트랜잭션이 적용될 타깃 인터페이스나 클래스, 메소드 등에 @Transactional 애노테이션을 부여해서 트랜잭션 대상으로 지정하고 트랜잭션의 속성 제공

@Transactional 적용 우선 순위: 클래스의 메소드 > 클래스 > 인터페이스의 메소드 > 인터페이스


스프링 AOP는 기본적으로 다이내믹 프록시 기법 - 인터페이스에 AOP를 적용

스프링은 JDK 다이내믹 프록시 외에도 CGLib 라이브러리가 제공하는 클래스 레벨 프록시 사용

<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />


설정 값

name

timeout - 트랜잭션 제한시간 설정. (default: -1) 제한 없음 

propagation - 전파 옵션 (default: REQUIRED)

REQUIRED : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성합니다.

REQUIRES_NEW : 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성되도록 합니다.

SUPPORT : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 nontransactionally로 실행됩니다.

MANDATORY : 부모 트랜잭션 내에서 실행되며 부모 트랜잭션이 없을 경우 예외가 발생됩니다.

NOT_SUPPORT : nontransactionally로 실행하며 부모 트랜잭션 내에서 실행될 경우 일시 정지 됩니다.

NEVER : nontransactionally로 실행되며 부모 트랜잭션이 존재한다면 예외가 발생합니다.

NESTED : 해당 메서드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백될 수 있습니다. 둘러싼 트랜잭션이 없을 경우 REQUIRED와 동일하게 작동합니다.

isolation - 격리 수준 (default: DEFAULT)

DEFAULT : DB에서 설정된 기본 격리 수준을 따릅니다.

SERIALIZABLE : 가장 높은 격리수준을 가지며 사용시 성능 저하가 있을 수 있습니다.

READ_UNCOMMITTED : 커밋되지 않은 데이터에 대한 읽기를 허용합니다.

READ_COMMITTED : 커밋된 트랜잭션에 대해 읽기를 허용합니다.

REPEATABLE_READ : 동일한 필드에 대한 다중 접근 시 동일한 결과를 얻을 수 잇는 것을 보장합니다.

read-only - 읽기 전용 (default: false) 

rollback-for - 예외 처리. 특정 예외가 발생했을 경우 rollback 되도록 설정 (default: RuntimeException) 

no-rollback-for - 특정 외예가 발생하더라도 rollback 되지 않도록 설정 (default: 없음)