728x90
오늘의 키워드
@Transactional에서 getTransaction
@Service
public class OrderService {
@Transactional
public void placeOrder() {
// 트랜잭션 시작됨 (TransactionInterceptor 가로챔)
orderRepository.save(new Order());
// 메서드 종료 -> 커밋 또는 롤백 수행
}
}
위처럼 @Transactional을 붙인 메서드를 실행하면 aop로 작동하여 트랜잭션이 시작, 종료 된다.
트랜잭션을 실행하는 클래스와 메서드를 알아보자.
JpaTransactionManager extends AbstractPlatformTransactionManager
JPA & Hibernate 사용 시 스프링 컨텍스트에 등록이 된다.
JpaTransactionManager는 AbstractPlatformTransactionManager를 상속하고 있다.
AbstractPlatformTransactionManager 에는
- prepareSynchronization(): 트랜잭션 동기화를 활성화
- suspend(): 현재 진행 중인 트랜잭션을 중단하고, 기존 트랜잭션의 상태를 저장
- resume(): suspend()로 중단된 트랜잭션을 다시 복구
- getTransaction(): 트랜잭션 가져옴
등의 메서드가 있다.
AbstractPlatformTransactionManager는 interface PlatformTransactionManager extends TransactionManager를 상속하고 있으며 해당 AbstractPlatformTransactionManager를 사용하여 실제 트랜잭션을 관리를 하는 곳이 TransactionInterceptor다.
아래는 getTransaction의 일부다.
public final TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException {
// Use defaults if no transaction definition given.
TransactionDefinition def = (definition != null ? definition : TransactionDefinition.withDefaults());
...
// 아래에서 startTransaction호출하고 startTransaction에서는 doBegin을 통해 트랜잭션 활성화
728x90