<aside>
<img src="/icons/reorder_gray.svg" alt="/icons/reorder_gray.svg" width="40px" />
목차
</aside>
1. 문제 상황
결제시스템에서 결제 승인·취소 요청을 처리할 때, 동시성 제어를 위해 Redisson 기반의 분산 락을 도입했습니다. 하지만 도입 후 특정 상황에서 트랜잭션 충돌로 인해 다음과 같은 오류가 발생했습니다.
- Transaction rolled back because it has been marked as rollback-only
- Transaction synchronization error
이로 인해 일부 요청이 실패하거나 데이터가 정상적으로 반영되지 않는 문제가 있었습니다.
2. 원인 분석
자세한 분석 결과, 문제의 원인은 다음과 같았습니다.
- 분산 락(Redisson Lock) 범위 안에 포함된 로직 중에서 DB 트랜잭션과 상충되는 작업이 존재했습니다.
- 락 획득 후 처리하는 로직이 길고 복잡해져 트랜잭션 유지 시간이 길어지고, 이로 인해 트랜잭션 충돌이 자주 발생했습니다.
- 트랜잭션 내에서 예외 발생 시, 트랜잭션이 Rollback-only로 표시되어 이후의 DB 처리 작업이 실패하였습니다.
즉, 분산 락과 DB 트랜잭션의 범위가 정확히 분리되지 않고 서로 중첩된 것이 근본적인 원인이었습니다.
3. 문제 해결 의사결정
이 문제를 해결하기 위해 다음과 같은 기술적 결정을 내렸습니다.
- 분산 락 처리 범위를 최소화하고, 락 내에서는 반드시 필요한 최소한의 로직만 유지하도록 결정했습니다.
- 트랜잭션 단위를 명확히 분리하여 락을 획득한 이후에 별도의 트랜잭션을 시작하도록 결정했습니다.
- 즉, 락을 획득하고 로직 실행 후 실제 DB 변경은 분리된 별도의 트랜잭션에서 진행하여 충돌을 방지합니다.