유지상

금융 전송 DB 데드락 재현과 개선

운영에서 발생한 데드락을 재현하고, 원인이 된 인덱스와 갱신 쿼리를 수정했습니다.

InnoDB, SQL, Integration Test

데드락으로 이체 결과를 반영하지 못했습니다

안정화 기간에 금융 전송 흐름을 모니터링하던 중, 결과 수신 처리가 금융기관 응답을 데이터베이스에 반영하지 못하는 문제를 발견했습니다. 송신 상태를 바꾸는 트랜잭션과 결과를 저장하는 트랜잭션은 독립적으로 실행됐지만, 같은 전송 데이터를 서로 다른 인덱스 경로로 갱신하다가 데드락을 만들었습니다. 결과 수신 쪽 업데이트는 rollback됐습니다.

데드락 원인 확인

송신 시스템과 응답 중계 시스템의 로그로 장애 시점의 처리 흐름을 연결했습니다. DB 데드락 로그와 실행계획에서는 상태 조건이 포함된 보조 인덱스와 같은 행의 기본 키에서 record X lock의 획득 순서가 엇갈린 것을 확인했습니다. 두 트랜잭션이 상대에게 필요한 잠금을 보유해 순환 대기가 만들어진 경로였습니다.

외부 연동을 테스트 서비스로 재현

실제 흐름에는 외부 중계망과 금융기관이 있어 개발 환경에서 이체 요청부터 응답 수신까지 그대로 실행하기 어려웠습니다. 두 외부 역할의 요청과 응답을 대체하는 테스트 서비스를 만들고, 장애 당시 조건과 데이터 구조로 송신·응답 흐름을 연결했습니다.

변경 전에는 이 테스트에서 운영과 같은 데드락을 재현했습니다. 이 테스트 서비스는 장애를 확인한 뒤에도 버리지 않고, 이체 요청·응답의 회귀 검증에 계속 쓰고 있습니다.

원인이 된 인덱스와 갱신 쿼리 수정

로그와 실행계획, 재현 테스트로 특정한 충돌 경로에 맞춰 보조 인덱스를 제거하고, 상태 갱신 쿼리가 복합키로 대상 레코드를 찾도록 수정했습니다. 같은 테스트 흐름을 다시 실행했을 때 금융기관 응답까지 정상 반영되는 것을 확인한 뒤 운영 환경에 배포했습니다.

원인과 수정 내용은 팀에 공유했습니다.

2주 동안 관찰했고 같은 데드락과 응답 갱신 실패는 다시 나타나지 않았습니다.

소속 경력