[문제]
- ParticipantRegistered 이벤트 처리 시 StaleObjectStateException 발생
- 100개의 이벤트가 동시에 발행되어 EventStats 동시 업데이트 충돌
- TransactionRequiredException 발생 (트랜잭션 컨텍스트 부재)
[해결]
1. 비관적 락(Pessimistic Lock) 적용
- EventStatsRepository에 findByEventIdWithLock 메서드 추가
- PESSIMISTIC_WRITE 락으로 읽는 순간부터 다른 트랜잭션 차단
2. 트랜잭션 추가
- 모든 Consumer 메서드에 @Transactional 어노테이션 추가
- EventCreatedConsumer, ParticipantRegisteredConsumer, DistributionCompletedConsumer
3. 이벤트 발행 속도 조절
- SampleDataLoader에서 10개마다 100ms 대기
- 동시성 충돌 빈도 감소
[수정 파일]
- EventStatsRepository.java: 비관적 락 메서드 추가
- ParticipantRegisteredConsumer.java: @Transactional 추가, 락 메서드 사용
- DistributionCompletedConsumer.java: @Transactional 추가, 락 메서드 사용
- EventCreatedConsumer.java: @Transactional 추가
- SampleDataLoader.java: 이벤트 발행 속도 조절
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>