이번시간부터는 트랜잭션이 동시에 둘 이상 있을때, 스프링이 트랜잭션을 어떻게 처리하는지, 그리고 관련한 트랝개션 전파(Propagation)이라는 개념을 알아보자.
바로 코드로 살펴보자.
@Autowired
PlatformTransactionManager txManager;
@TestConfiguration
static class config {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
위와 같은 설정을 통해 기본적인 트랜잭션을 처리하는 매니저를 등록할 수 있다.
참고로 스프링은 사용하는 기술을 바탕으로 자동으로 그에 맞는 트랜잭션 매니저를 빈으로 등록하게끔 설정되어있다. 하지만 위처럼 직접 트랜잭션 매니저를 빈으로 등록하면 그런 기능은 비활성화되고 개발자가 등록한 매니저가 동작하게 된다.
또한 위의
PlatformTrasactionManager
는 스프링이 제공하는 트랜잭션 매니저의 인터페이스이다.DataSourceTrasactionManager
는 JDBC를 위한 트랜잭션 매니저 구현체이다.
@Test
void commit() {
log.info("트랜잭션 시작");
TransactionStatus status = txManager.getTransaction(new DefaultTransactionAttribute());
log.info("트랜잭션 커밋 시작");
txManager.commit(status);
log.info("트랜잭션 커밋 완료");
}
동작 방식을 보면, 새로운 트랜잭션을 생성하고 트랜잭션 풀에서 트랜잭션을 얻어온 다음(Acquired connection) 트랜잭션 커밋을 시작하고, 커밋하고, 릴리즈(커넥션 풀에 커넥션을 반환)하는 동작을 거치고 있다.
다음은 롤백 예제이다.
@Test
void rollback() {
log.info("트랜잭션 시작");
TransactionStatus status = txManager.getTransaction(new DefaultTransactionAttribute());
log.info("트랜잭션 롤백 시작");
txManager.rollback(status);
log.info("트랜잭션 롤백 완료");
}
다 똑같은데 가져온 커넥션으로 커밋하냐, 롤백하냐의 차이이다.