- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26741432&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
@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 처럼 동작 |
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26741432&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.