잠금이 길게 유지
같은 결제 흐름이라도 트랜잭션 경계를 어디에 두느냐에 따라 잠금 시간, 동시성, 실패 처리 범위가 크게 달라집니다.
결제 성공이 확인되면 orders.status = 'PAID' 와 INSERT INTO payment_log 를 같은 커밋으로 남겨 상태와 로그를 함께 맞춥니다.
UPDATE orders ... 를 먼저 실행한 뒤 외부 호출을 기다립니다.DB 상태를 건드린 시점부터 트랜잭션이 열려 있으므로, 외부 응답이 늦어질수록 잠금도 함께 늘어납니다.
네트워크 지연은 트랜잭션 밖에서 소화하고, DB에는 확정된 결과만 반영합니다.
외부 호출 실패 시 롤백 범위가 커지고, 처리 도중 다른 세션이 오래 대기할 수 있습니다.
orders 상태 변경과 payment_log 기록을 한 번에 묶습니다.DB 안에서는 일관된 성공 결과만 남기므로, 커밋 이후 상태가 더 예측 가능해집니다.
애플리케이션 바깥의 느린 응답이 DB 병목으로 번지는 전형적인 패턴입니다.
실패는 트랜잭션 밖에서 재시도하고, DB 안에서는 확정된 상태만 빠르게 저장하면 됩니다.