@Configuration
public class TransactionConfig {
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
Transactional boundaries
3-1. @Transactional
스프링에서 트랜잭션 경계를 설정하기 위한 어노테이션
메서드 또는 클래스의 실행 → 하나의 트랜잭션으로 묶음 ⇒ 데이터 일관성 보장!
3-1-1. 주요 속성
propagation : 트랜잭션 전파 방식 설정
REQUIRED : 현재 트랜잭션 존재 시 사용, 없으면 새로 생성
REQUIRES_NEW : 항상 새 트랜잭션 생성, 기존 트랜잭션 중단
NESTED : 중첩 트랜잭션 (지원하는 경우에만)
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
method1(); // 같은 트랜잭션 사용
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method1() {
// 항상 새 트랜잭션 생성
}
isolation : 트랜잭션 격리 수준 설정
READ_UNCOMMITTED : 다른 트랜잭션의 변경사항 읽기 가능
READ_COMMITTED : 다른 트랜잭션의 커밋된 변경사항만 읽기 가능
REPEATABLE_READ : 동일 쿼리 결과 일관성 유지
SERIALIZABLE : 가장 높은 격리 수준, 완전한 독립성 보장
@Transactional(isolation = Isolation.SERIALIZABLE)
public void method3() {
// 가장 높은 격리 수준을 필요로 하는 작업
}
timeout : 트랜잭션 타임아웃 설정
rollbackFor : 롤백할 예외 지정
@Transactional(rollbackFor = MyException.class)
public void method4() throws MyException {
// MyException 발생 시 롤백
}