- TransactionManager
스프링 트랜잭션 처리의 중심이 되는 인터페이스 = PlatformTransactionManager
스프링 프레임워크는 다양한 환경과 제품에 대응하는 PlatformTransactionManager의 구현 클래스를 제공한다.
DataSourceTransactionManager : JDBC 및 마이바티스 등의 JDBC 기반 라이브러리로 데이터베이스에 접근하는 경우에 이용한다.
HibernateTransactionManager : 하이버네이트를 이용해 데이터베이스에 접근하는 경우에 이용한다.
JpaTransactionManager : JPA로 데이터베이스에 접근하는 경우에 이용한다.
- TransactionManager 정의
PlatformTransactionManager의 빈을 정의한다.
@Bean
public PlatformTransactionManager transactionManager() {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(mcpDataSource());
transactionManager.setGlobalRollbackOnParticipationFailure(false);
return transactionManager;
}
- 스프링의 트랜잭션 서비스 추상화 기법
PlatformTransactionManager(TransactionManager 의 최상위 인터페이스) 라는
인터페이스에 각자의 DB에 해당되는 TransactionManager 클래스를 의존주입 해준다.
setNestedTransactionAllowed : 중첩 트랜잭션을 가능하도록 설정
/**
* Create a new DataSourceTransactionManager instance.
* A DataSource has to be set to be able to use it.
* @see #setDataSource
*/
public DataSourceTransactionManager() {
setNestedTransactionAllowed(true);
}
TransactionAwareDataSourceProxy : 스프링이 관리하는 트랜잭션을 인지하도록 대상 DataSource를 감싸는 프록시
setGlobalRollbackOnParticipationFailure : 트랜잭션을 시작한 메서드 (이 경우 outerTestMethod ())에서 예외가 발생할 때만 트랜잭션이 롤백되도록 자동으로 설정하는 방법
그 후에 TransactionStatus 객체를 생성해준다.
이시점이 트랜잭션의 시작시점이 되는 것이다.
그리고 예외없이 메소드가 잘 수행되면 transactionManager.commit(status),
예외가 발생하였다면 transactionManager.rollback(status) 메소드를 수행시킨다.
이 시점이 트랜잭션 범위의 끝지점이 되는 것이다.
이렇게 범위를 설정하게 되면 @Transactional이 정의된 곳에서 예외가 발생 시,
이전에 수행됬던 것들이 모두 rollback 된다.
반대로 정상적으로 완료가 되면 commit 된다.
- PlatformTransactionManager 인터페이스
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
트랜잭션 전략은 PlatformTransactionManager 인터페이스가 정의한다.
PlatformTransactionManager 구현체는 Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)으로 정의한다.
1. TransactionStatus getTransaction(TransactionDefinition definition)
TransactionDefinition 파라미터에 따라 TransactionStatus 객체를 반환한다.
TransactionStatus
반환된 TransactionStatus는 새로운 트랜잭션을 나타내거나 현재 콜스택에 존재하는 트랜잭션 중
일치하는 것이 있다면 존재하는 트랜잭션을 나타날 수 있다.
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction(); // 새로운 트랜잭션이 존재하는지 확인
boolean hasSavepoint(); // 현재 일치하는 트랜잭션이 존재하는지 확인
void setRollbackOnly(); // rollback 가능하도록 설정
boolean isRollbackOnly(); // rollback이 되었는지 확인
void flush(); // 실제 DB에 동기화
boolean isCompleted(); // 트랜잭션이 완료되었는지 확인
}
TransactionDefinition
해당 인터페이스는 다음을 지정한다.
격리(Isolation)
해당 트랜잭션이 다른 트랜잭션의 작업과 격리되는 정도를 지정한다.
전파(Propagation)
트랜잭션 경계의 시작 지점에서 트랜잭션 전파 속성을 참조해서 해당 범위의 트랜잭션을 어떤 식으로 진행시킬지 정할 수 있다.
시간만료(Timeout)
시간이 만료되기 전에 해당 트랜잭션이 얼마나 오랫동안 실행되고 의존 트랜잭션 인프라스트럭처가 자동으로 롤백하는 지를 나타낸다.
읽기 전용 상태(Read-only status)
코드가 데이터를 읽기는 하지만 수정하지는 않는 경우 읽기 전용 트랜잭션을 사용할 수 있다.
2. void commit(TransactionStatus status)
예외없이 정상적으로 트랜잭션이 수행되어 커밋 시, 호출된다.
3. void rollback(TransactionStatus status)
예외가 발생하여 이전 작업 롤백 시, 호출된다