응답을 못 받았다고 실패한 건 아니야
네트워크 호출은 데이터베이스가 보기 전에 끊길 수도 있고, 처리는 끝났지만 응답만 사라질 수도 있어. 호출자는 둘을 구분할 수 없으므로 같은 요청을 다시 보내도 안전해야 해.
반복해도 결과가 같은 연산
SET status = 'paid'는 여러 번 실행해도 같은 상태지만 SET balance = balance - 100은 실행할 때마다 달라져. 후자는 멱등하지 않아.
쓰기를 멱등하게 만드는 방법
- INSERT에는
ON CONFLICT DO NOTHING이나DO UPDATE를 이용해. - 클라이언트가 보낸 멱등성 키를 고유 제약으로 지켜.
- 가능하면
SET balance = ?처럼 절대값을 쓰고SET balance = balance - ?같은 증감은 고유한 작업 기록과 묶어. - 같은 요청을 100번 받아도 한 번의 결과만 남는지 시험해.