Skip to content

fix: PracticeService complete() 트랜잭션 분리로 HikariCP 커넥션 고갈 방지#33

Draft
Jeongho0805 wants to merge 1 commit into
stagefrom
fix/PRACTICKET-52-practice-complete-tx
Draft

fix: PracticeService complete() 트랜잭션 분리로 HikariCP 커넥션 고갈 방지#33
Jeongho0805 wants to merge 1 commit into
stagefrom
fix/PRACTICKET-52-practice-complete-tx

Conversation

@Jeongho0805

Copy link
Copy Markdown
Owner

변경 사항

  • PracticeService.complete()@Transactional(propagation = Propagation.NOT_SUPPORTED) 추가
  • 클래스 레벨 @Transactional이 적용되던 complete()를 트랜잭션 없는 컨텍스트로 전환하여 resultRepository.save(), rankCalculator.calculate() 각각이 자체 단기 트랜잭션을 사용하도록 분리

배경

Sentry 이슈 PRACTICKET-52: POST /api/practice/complete에서 CannotCreateTransactionException: Could not open JPA EntityManager for transaction 발생.

클래스 레벨 @Transactional로 인해 complete() 전체—resultRepository.save() (쓰기) + rankCalculator.calculate() 내 집계 쿼리 2개(countRecordsBetterThan, countRecordsInMonth)—가 단일 트랜잭션으로 묶여 HikariCP 커넥션을 장시간 점유한다. 동시 요청이 늘어나면 풀이 고갈되고, 커넥션 대기 중인 스레드가 인터럽트되어 InterruptedExceptionSQLException(HikariPool-1 - Interrupted during connection acquisition)CannotCreateTransactionException 연쇄가 발생한다.

Propagation.NOT_SUPPORTED를 지정하면 각 하위 작업이 SpringData 내장 @Transactional로 독립 실행되어 커넥션을 즉시 반환하므로 풀 고갈을 방지한다.

POST /api/practice/complete 처리 시 클래스 레벨 @transactional이 save()와
rankCalculator.calculate()(집계 쿼리 2개)를 하나의 트랜잭션으로 묶어 커넥션을
장시간 점유, 풀 고갈 후 InterruptedException → CannotCreateTransactionException
연쇄 발생. complete()에 Propagation.NOT_SUPPORTED를 지정해 각 하위 작업이
자체 단기 트랜잭션을 사용하도록 분리하여 커넥션 반환 시점을 앞당긴다.
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.

1 participant