트랜잭션
- 여러개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위
- 전부 성공하든가 전부 실패하든가(All or Nothing) ➡ 데이터 무결성
- ACID 원칙 (데이터베이스 트랜잭션이 안전하게 수행되는 것을 보장하기 위한 성질)
- 원자성: 작업을 더 이상 쪼갤 수 없음
- 일관성: 비즈니스 로직에서 의도하는대로 일관성있게 저장되거나 변경되는 것
- 격리성: 여러개의 트랜잭션이 실행될 경우 각각 독립적으로 실행이 되어야 함
- 지속성: 트랜잭션이 완료되면 그 결과는 지속되어야 함, 물리적인 저장소
- 트랜잭션 커밋과 롤백
Spring FrameWork에서의 트랜잭션 처리
- 트랜잭션
- 로컬 트랜잭션
- 분산 트랜잭션
- Spring에서 사용되는 트랜잭션 방식
- 선언형 트랜잭션(비즈니스 로직에 애너테이션 추가, AOP방식)
프로그래맹 코드 베이스 트랜잭션
애너테이션 방식의 트랜잭션 적용
- @Transactional 이라는 애너테이션을 트랜잭션이 필요한 영역에 추가
- 클래스 레벨과 메서드 레벨
- 조회 메서드에 @Transactional(readOnly = true) : flush처리를 하지 않고, 스냅샷도 생성하지 않으므로 효율적
- 트랜잭션 전파
- 트랜잭션 격리 레벨
AOP 방식의 트랜잭션 적용
더보기
// (1)
@Configuration
public class TxConfig {
private final TransactionManager txm;
// (2)
public TxConfig(TransactionManager txm) {
this.txm = txm;
}
@Bean
public TransactionInterceptor txAdvice() {
NameMatchTransactionAttributeSource txAttributeSource =
new NameMatchTransactionAttributeSource();
// (3)
RuleBasedTransactionAttribute txAttribute =
new RuleBasedTransactionAttribute();
txAttribute.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// (4)
RuleBasedTransactionAttribute txFindAttribute =
new RuleBasedTransactionAttribute();
txFindAttribute.setPropagationBehavior(
TransactionDefinition.PROPAGATION_REQUIRED);
txFindAttribute.setReadOnly(true);
// (5)
Map<String, TransactionAttribute> txMethods = new HashMap<>();
txMethods.put("find*", txFindAttribute);
txMethods.put("*", txAttribute);
// (6)
txAttributeSource.setNameMap(txMethods);
// (7)
return new TransactionInterceptor(txm, txAttributeSource);
}
@Bean
public Advisor txAdvisor() {
// (8)
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("execution(* com.codestates.coffee.service." +
"CoffeeService.*(..))");
return new DefaultPointcutAdvisor(pointcut, txAdvice()); // (9)
}
}
- AOP 방식으로 트랜잭션을 적용하기 위한 Configuration 클래스 정의
- TransactionManager DI
- 트랜잭션 어드바이스용 TransactionInterceptor 빈 등록
- 트랜잭션 애트리뷰트 지정
- 트랜잭션을 적용할 메서드에 트랜잭션 애트리뷰트 매핑
- TransactionInterceptor 객체 생성
- Advisor 빈 등록
- 포인트 컷 지정
- Advisor 객체 생성
📚 심화학습
- 분산 트랜잭션
- 다이나믹 프록시
- 프록시 패턴
'부트캠프 기록 > Section3' 카테고리의 다른 글
java.lang.UnsupportedClassVersionError 해결방법 (0) | 2022.11.15 |
---|---|
[Spring MVC] Mockito (0) | 2022.11.13 |
[Spring MVC] JPA 연관관계 매핑 (0) | 2022.11.03 |
[Spring MVC] JBDC 기반 데이터 엑세스 계층 (0) | 2022.10.30 |
[Spring MVC] API 계층_DTO(Data Transfer Object) (0) | 2022.10.29 |