피드로 돌아가기
Idempotency Situation
Dev.toDev.to
Backend

Idempotency Situation

데이터베이스 레벨에서는 중복 트랜잭션을 자동으로 감지하지 못해 같은 계좌이체 요청이 반복 실행될 때마다 잔액이 계속 변경되는 현상

Jonah Blessy2026년 3월 25일5intermediate

Context

데이터베이스는 개별 트랜잭션의 일관성만 보장하며, 동일한 요청이 여러 번 전송되었을 때 이를 자동으로 감지하지 않는다. 네트워크 지연이나 사용자 재시도로 인해 동일한 작업이 여러 번 실행되는 실제 환경에서 중복 처리로 인한 데이터 오염이 발생한다.

Technical Solution

  • 중복 트랜잭션 감지 구조: SELECT * FROM accounts로 초기 잔액 확인 후 UPDATE accounts SET balance = balance - 100 WHERE name = 'Alice'를 통해 동일한 작업을 반복 실행하여 데이터 변경 패턴 검증
  • 단일 트랜잭션 실행: BEGIN과 COMMIT으로 Alice에서 100을 차감하고 Bob에 100을 증액하는 작업을 원자적 단위로 처리
  • 중복 요청 시뮬레이션: 동일한 UPDATE 문을 여러 번 실행하여 각 반복마다 잔액이 재변경되는 동작 확인
  • 데이터베이스 자동 중복 방지 부재 확인: 모든 실행이 유효한 트랜잭션으로 처리되며 이전 실행 여부를 추적하지 않음
  • 애플리케이션 레벨 중복 방지 기법 필요: 고유 트랜잭션 ID, idempotency key, 또는 처리된 요청 로그를 이용한 상위 계층 구현 권장

Key Takeaway

데이터베이스는 트랜잭션 내부의 일관성만 보장하며, 중복 요청 방지는 unique transaction ID, idempotency key, 요청 처리 로그 등을 활용한 애플리케이션 레벨 구현이 필수이다.


계좌이체, 결제 등 금융 트랜잭션을 다루는 백엔드 시스템에서 idempotency key를 요청에 포함시키고 이미 처리된 key에 대해서는 캐시된 응답을 반환하는 방식으로 구현하면, 네트워크 재시도나 중복 요청 시에도 실제 작업은 정확히 한 번만 수행되도록 보장할 수 있다.

원문 읽기