Skip to content

Conversation

@caniro
Copy link
Contributor

@caniro caniro commented Jun 7, 2025

✨ 작업내용

  • 체결이 연속해서 진행되도록 로직 수정했습니다. 946e6fc

⚠️ 특별사항

  • @bongj9 TradeEventHandler @EventListener -> @TransactionalEventListener 로 변경했습니다.
  • PR 올라온 것들 다 적용되면 어느정도 안정화는 될 것 같네요..

@caniro caniro requested a review from bongj9 June 7, 2025 18:16
@caniro caniro self-assigned this Jun 7, 2025
@investfuture-sonarqube1
Copy link

Failed Quality Gate failed

  • 1 New Issues (is greater than 0)
  • 0.00% Coverage on New Code (is less than 80.00%)

Project ID: CleanEngine_cleanengine-be_2b6f2f63-fa39-426c-b9c7-8aa127fd14d8

View in SonarQube

@caniro caniro linked an issue Jun 7, 2025 that may be closed by this pull request
1 task
Copy link
Contributor

@Junh-b Junh-b left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수정내용 확인했습니다.
혹시 목요일에 이벤트리스너 이후에 트랜잭션 활성화되지 않던 이슈 원인 파악하셨나요?

@caniro
Copy link
Contributor Author

caniro commented Jun 8, 2025

수정내용 확인했습니다. 혹시 목요일에 이벤트리스너 이후에 트랜잭션 활성화되지 않던 이슈 원인 파악하셨나요?

아뇨 아직이요ㅠ
주문 DB 저장 이후 SpringOrderCreatedAddQueueHandler에서 처리될 때랑 그 이후에도 계속 트랜잭션에 참여 중인 것으로 확인되는데, 아직 이 원인을 모르겠네요.
기본 전파속성인 REQUIRED 상태에서 이미 커밋된 상위 트랜잭션에 참여하고, 이후에 객체를 변경하니까 다시 커밋이 되지 않는 상황으로 예상하고 있어요. 그래서 REQUIRES_NEW 로 새 트랜잭션을 열면 해결되는 것 같구요..

@caniro caniro merged commit eece674 into dev Jun 8, 2025
1 check passed
@caniro
Copy link
Contributor Author

caniro commented Jun 13, 2025

수정내용 확인했습니다. 혹시 목요일에 이벤트리스너 이후에 트랜잭션 활성화되지 않던 이슈 원인 파악하셨나요?

아뇨 아직이요ㅠ 주문 DB 저장 이후 SpringOrderCreatedAddQueueHandler에서 처리될 때랑 그 이후에도 계속 트랜잭션에 참여 중인 것으로 확인되는데, 아직 이 원인을 모르겠네요. 기본 전파속성인 REQUIRED 상태에서 이미 커밋된 상위 트랜잭션에 참여하고, 이후에 객체를 변경하니까 다시 커밋이 되지 않는 상황으로 예상하고 있어요. 그래서 REQUIRES_NEW 로 새 트랜잭션을 열면 해결되는 것 같구요..

(우연히 발견해서 여기도 원인 기록)
@Transactional 어노테이션이 붙은 메서드의 끝까지 진행되어 커밋은 되었으나, @TransactionalEventListener로 인해 스프링 트랜잭션 동기화 컨텍스트는 활성화 중이어서 해당 문제가 발생했었습니다.

// 트랜잭션 동기화의 주요 단계
1. 커밋 준비
   prepareForCommit(status)
   -> 커밋을 위한 준비 작업 수행

2. commit 전
   triggerBeforeCommit(status)
   -> 각 synchronization.beforeCommit(readOnly) 호출

3. 완료 전
   triggerBeforeCompletion(status)
   -> 각 synchronization.beforeCompletion() 호출

4. 실제 커밋
   doCommit(status)
   -> 실제 데이터베이스 트랜잭션 커밋

5. commit 후
   triggerAfterCommit(status)
   -> invokeAfterCommit(synchronizations)
   -> 각 synchronization.afterCommit() 호출
   -> @TransactionalEventListener(AFTER_COMMIT) 실행   <<< 이 부분

6. 완전히 완료 후
   triggerAfterCompletion(status, completionStatus)
   -> invokeAfterCompletion(synchronizations, completionStatus)
   -> 각 synchronization.afterCompletion(completionStatus) 호출

7. 최종 정리
   cleanupAfterCompletion(status)
   -> TransactionSynchronizationManager.clear() 호출
   -> 모든 트랜잭션 리소스 정리

출처: https://curiousjinan.tistory.com/entry/fixing-spring-transactionaleventlistener-after-commit-update-issue [오늘도 개발중입니다:티스토리]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BE] 서비스 재시작 시 누적분 체결되도록 변경

3 participants