@Slf4j
static class BasicService {
@Transactional
public void tx() {
log.info("call tx");
boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active = {}", txActive);
}
public void nonTx() {
log.info("call None tx");
boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active = {}", txActive);
}
}
TransactionSynchronizationManager.isActualTransactionActive()
위 코드는 현재 로직에 트랜잭션이 걸린 상태인지 확인하며, 트랜잭션 동기화 매니저에서 관련 작업을 했는지를 확인한다.
AopUtils.isAopProxy(basicService)
위 코드는 BasicService 객체가 original 객체인지, 프록시 객체인지 확인하는 코드이다.
스프링은 @Transactional 이 붙은 메서드가 하나라도 있다면 트랜잭션 AOP 프록시를 만들어 스프링 컨테이너에 등록한다.
logging.level.org.springframework.transaction.interceptor=TRACE
다음과 같이 설정하면 트랜잭션 프록시가 호출하는 트랜잭션의 시작과 종료를 명확하게 로그로 알 수 있다.