728x90
Transaction의 완전 분리를 위해 @EventListener에서 @TransactionalEventListener로 변경하였습니다.
하지만 변경을 하고 테스트를 해보니 PointHistory데이터가 적재되지 않는 현상을 발견하였습니다...
우선 원인 추적을 위해 로그를 확인해 보았습니다.
위 로그를 확인해 보면 Point의 Update sql은 로그에 찍혔지만, 정장 Point_history를 Insert 하는 sql은 존재하지 않는 것을 확인할 수 있습니다.
왜 그럴까?
정답은 @TransactionalEventListener에 있었습니다.
이에 대한 내용은 여기서 확인할 수 있습니다.
내용인 즉, @TransactionalEventListener를 사용할 때 AFTER_COMMIT (the default), AFTER_ROLLBACK, or AFTER_COMPLETION 옵션을 사용하였다면 이전 트랜잭션 리소스는 살아있어 참여는 가능하나 변경내용에 대해 커밋은 할 수 없다는 내용입니다.
그럼 어떻게 해결할 수 있을까?
이전 트랜잭션에 참여하는 것이 아닌 현재 시점부터 새로운 트랜잭션을 할당하여 사용하면 되는 것입니다!
@Component
@RequiredArgsConstructor
public class PointHistoryHandler {
//
@TransactionalEventListener
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void on(ChargedPoint event) {
//
포인트_충전_내역_생성();
}
@TransactionalEventListener
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void on(UsedPoint event) {
//
포인트_사용_내역_생성();
}
}
위와 같이 Transaction의 전파레벨을 Propagation.REQUIRES_NEW를 사용하면 새로 Transaction을 할당하여 정상적으로 변경사항을 Commit 또는 Rollback 할 수 있습니다.
Reference
728x90
'Server' 카테고리의 다른 글
[ Test ] Concert 장애 분석 및 대응 문서 (0) | 2024.08.21 |
---|---|
[Kafka] Kafka란?( 작성중... ) (0) | 2024.08.11 |
[EDA] 기존 서비스를 분석하고 Event를 활용하여 Transaction범위 분리 작업 (0) | 2024.08.07 |
대기열 성능 분석 및 Redis sorted set을 활용한 리펙토링 (0) | 2024.08.02 |
[ Caching ] 캐싱 적용 API분석 및 K6를 사용한 성능 테스트 결과 (0) | 2024.08.01 |