반응형
최근에 PessimisticLockingFailureException 예외를 마주쳤다.
이번에 내가 겪은 사례는 조금 특이한 구조에서 발생했다.
상황 요약
- A 프로젝트가 B 프로젝트의 API를 호출한다.
- A와 B 모두 트랜잭션을 사용한다.
- B에서 JPA로 flush() 를 수행했는데 이 시점에 PessimisticLockingFailureException 이 발생했다.
원인
핵심은 이중 트랜잭션 구조에 있다.
- A 프로젝트에서 트랜잭션이 열린 상태로 B를 호출한다.
- B에서도 트랜잭션이 별도로 시작된다.
- B에서 JPA가 엔티티를 비관적 락(PESSIMISTIC_WRITE)으로 조회한다.
- flush() 시점에 락을 걸 수 없어서 예외 발생:
- A 쪽 트랜잭션이 락을 보유하고 있거나,
- DB가 락 획득에 실패하거나 타임아웃이 발생한 경우.
이런 구조는 DB 입장에서는 두 개의 독립된 트랜잭션이 같은 자원에 접근하려고 하는 것으로 보이기 때문에 충돌이 난다.
해결 방안
여러 방법이 있겠지만 한쪽 Transaction을 해제하는 것으로 해결했다.
사실 별거 아니라고 생각하지만 이거 때문에 삽질할 초보 개발자 분들을 위해 정리 해놓는다.
728x90
'🍃 Spring' 카테고리의 다른 글
[Spring Batch] 개인 정리 (0) | 2025.02.14 |
---|---|
[Spring] RFC 7232 - Conditional Requests로 비용 및 부하 최적화 하기 (0) | 2025.01.21 |
[Spring] gRPC 사용법 (0) | 2025.01.20 |
[Spring] Redis 연결 관리 및 성능 최적화 (0) | 2025.01.06 |
[Spring] 동시성(Concurrency) 이슈 - 그 외(3) (0) | 2024.11.05 |