TransactionalManager
같은 트랜잭션 내에서 같은 Connection을 사용할 수 있게 관리한다.
Spring에서 트랜잭션을 사용하는 방법은 첫 번째로 직접 TransactionManager를 사용하여 관리하는 방법이 있다.
public void insertA1WithTxManager() throws Exception{
PlatformTransactionManager tm = new DataSourceTransactionManager(ds);
TransactionStatus status = tm.getTransaction(new DefaultTransactionDefinition());//Tx의 속성을 정의
try {
a1Dao.insert(1, 100); //핵심기능
a1Dao.insert(2, 200); //핵심기능
tm.commit(status); //Commit
} catch (Exception e) {
tm.rollback(status); //Rollback
}
}
두 번째로는 TransactionManager를 root-context.xml에 Bean으로 등록하고 @Transactional 어노테이션을 사용하는 방법이 있다. 어노테이션을 사용하면 AOP를 이용한 핵심 기능 코드와 트랜잭션의 코드를 분리할 수 있다.
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven/><!-- 어노테이션 사용을 위해 입력 -->
@Transactional //'@Transactional'만 적으면 RuntimeException, Error만 rollback
public void insertA1WithTxSuccess() throws Exception{
a1Dao.insert(1, 100);
a1Dao.insert(2, 200);
}
//Exception을 rollback
@Transactional(rollbackFor = Exception.class)
public void insertA1WithTxFail() throws Exception{
a1Dao.insert(1, 100);
a1Dao.insert(1, 200);
}
@Transactional의 속성
- propagation : 트랜잭션의 경계를 설정하는 방법을 지정
- isolation : 트랜잭션의 isolation level을 지정 (DEFAULT, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
- readOnly : 트랜잭션이 데이터를 읽기만 하는 경우, true로 지정하면 성능이 향상
- rollbackFor : 지정된 예외가 발생하면, 트랜잭션을 rollback / RuntimeException과 Error는 자동 rollback
- noRollbackFor : 지정된 예외가 발생해도, 트랜잭션을 rollback하지 않음
- timeout : 지정된 시간(초) 내에 트랜잭션이 종료되지 않으면, 트랜잭션을 강제 종료
propagation 속성의 값
- REQUIRED : 트랜잭션이 진행 중이면 참여하고, 없으면 새로운 트랜잭션 시작(디폴트)
- REQUIRES_NEW : 트랜잭션이 진행 중이건 아니건, 새로운 트랜잭션 시작
- NESTED : 트랜잭션이 진행 중이면, 트랜잭션의 내부 트랜잭션으로 실행
- MANDATORY : 반드시 진행 중인 트랜잭션 내에서만 실행 가능. 아니면 예외 발생
- SUPPORTS : 트랜잭션이 진행 중이건 아니건 상관없이 실행
- NOT_SUPPORTED : 트랜잭션 없이 처리. 트랜잭션이 진행 중이면 잠시 중단(suspend)
- NEVER : 트랜잭션없이 처리. 트랜잭션이 진행 중이면 예외 발생
'WEB > spring' 카테고리의 다른 글
[Spring] Junit4를 이용해 테스트하기 (0) | 2022.06.27 |
---|---|
[Spring] Log4j 설정하기(log4jdbc-log4j2) - MySql, mariaDB (0) | 2022.06.24 |
[Spring] Controller, Service, DAO, DTO (0) | 2022.06.21 |
[Spring] AOP 개념 및 라이브러리 설치 (0) | 2022.06.17 |
[Spring] DI, 어노테이션 정리 (0) | 2022.06.16 |
댓글