by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

Transactional 어노테이션을 이용한 선언적 트랜잭션




@Transactional을 이용한 선언적 트랜잭션

Configuration 설정

  • <tx:annotation-driven..>에 transactionManager를 설정하면 된다.
applicationContext-datasource.xml
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

@Transaction 속성

  • @Transactional에 속성을 정의하여 쓸 수 있는데 속성 목록은 아래와 같다.
속성 설 명 사용 예
isolation Transaction의 isolation Level. 별도로 정의하지 않으면 DB의 Isolation Level을 따름. @Transactional(isolation=Isolation.DEFAULT)
propagation 트랜잭션 전파규칙을 정의 , Default=REQURIED @Transactional(propagation=Propagation.REQUIRED)
readOnly 해당 Transaction을 읽기 전용 모드로 처리 (Default = false) @Transactional(readOnly = true)
rollbackFor 정의된 Exception에 대해서는 rollback을 수행 @Transactional(rollbackFor=Exception.class)
noRollbackFor 정의된 Exception에 대해서는 rollback을 수행하지 않음. @Transactional(noRollbackFor=Exception.class)
timeout 지정한 시간 내에 해당 메소드 수행이 완료되지 않은 경우 rollback 수행.
-1일 경우 no timeout (Default = -1)
@Transactional(timeout=10)

Isolation Level (격리 레벨)

  • Transaction에서 일관성이 없는 데이터를 허용하도록 하는 수준이며, 여러 Transaction들이 다른 Transaction의 방해로부터 보호되는 정도를 나타낸다.
속성 설 명
ISOLATION_DEFAULT 데이터베이스에 의존
ISOLATION_READ_UNCOMMITTED 격리레벨중 가장 낮은 격리 레벨이다.
다른 Commit되지 않은 트랜잭션에 의해 변경된 데이터를 볼 수 있다.
거의 트랜잭션의 기능을 수행하지 않는다.
ISOLATION_READ_COMMITTED 데이터베이스에서 디폴트로 지원하는 격리 레벨이다.
다른 트랜잭션에 의해 Commit되지 않은 데이터는 다른 트랜잭션에서 볼 수 없다.
일반적 으로 가장 많이 사용한다.
ISOLATION_REPEATABLE_READ 다른 트랜잭션이 새로운 데이터를 입력했다면 볼 수 있다.
트랜잭션이 완료 될때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에대한 수정이 불가능하다
ISOLATION_SERIALIZABLE 하나의 트랜잭션이 완료된 후에 다른 트랜잭션이 실행하는 것처럼 지원한다.
동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행 될 수 없다.

Propagation Behavior (전달 행위)

  • mvc-dispatcher-servlet.xml에 아래의 component-scan으로 패키지를 명시해야 한다.
속성 설 명
PROPAGATION_REQUIRED 기존의 트랜잭션이 존재하면 그 트랜잭션을 지원, 없다면 새로운 트랜잭션을 시작.
가장 자주 사용되는 옵션
PROPAGATION_SUPPORTS 기존의 트랜잭션이 존재하면 그 트랜잭션을 지원, 없다면 비-트랜잭션 상태로 수행
PROPAGATION_MANDATORY 반드시 Transaction 내에서 메소드가 실행되어야 한다. 없으면 예외발생
PROPAGATION_REQUIRES_NEW 언제나 새로운 트랜잭션을 수행, 이미 활성화된 트랜잭션이 있다면 일시정지 한다.
PROPAGATION_NOT_SUPPORTED 새로운 Transaction을 필요로 하지는 않지만, 기존의 Transaction이 있는 경우에는 Transaction 내에서 메소드를 실행한다.
PROPAGATION_NEVER Manatory와 반대로 Transaction 없이 실행되어야 하며 Transaction이 있으면 예외를 발생시킨다
PROPAGATION_NESTED 현재의 트랜잭션이 존재하면 중첩된 트랜잭션내에서실 행, 없으면 REQUIRED 처럼 동작

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.