사람이 읽는 연속 번호를 중복도 결번도 없이 발급하는 계약입니다.
문서 번호는 사람이 눈으로 읽고 전화로 불러 주는 식별자이면서, 동시에 유일해야 하는 값입니다. 최댓값을 읽고 1을 더해 저장하는 방식은 읽기와 쓰기가 따로 왕복하므로, 그 사이에 다른 요청이 같은 값을 읽으면 두 문서가 같은 번호를 받습니다. 발급을 한 번의 원자적 청구로 정하고 형식 검증을 발급과 떼어 두면 중복과 결번이 모두 막힙니다.
번호 청구를 연산 하나로 만들어 읽기와 쓰기 사이의 틈을 없애고, 같은 번호가 두 번 나가지 않게 합니다.
두 요청이 같은 값을 읽고 각자 1을 더하면 한쪽 결과가 사라집니다. 전형적인 동시성 결함입니다.
접두사, 연도, 자릿수를 계약으로 고정해 언제 발급한 번호든 정렬과 파싱 결과가 같습니다.
아래 증명은 글로 된 설명이 아닙니다. 버튼을 누르면 이 서버가 지금 직접 계산합니다.
형식은 발급과 분리된 계약입니다. 자릿수가 넘치거나 모자란 표기는 조용히 고치지 않고 거부합니다. 고쳐 주면 같은 문서에 표기가 두 가지 생기기 때문입니다.
표준 문서에 실린 테스트 벡터를 그대로 넣어 같은 값이 나오는지 확인합니다.
이 증명은 같은 조건에서 두 구현을 나란히 실행합니다. 읽은 뒤 쓰는 방식은 동시에 들어온 청구 여덟 건에 모두 같은 번호를 주고, 한 번에 끝나는 원자적 청구는 그렇지 않습니다. 부하가 낮으면 몇 달이 지나도 드러나지 않는 결함입니다.
막아야 할 입력을 실제로 넣고 거부되는지 확인합니다.
규격 원문을 먼저 실었습니다. 사례는 이 분야에서 실제로 보안이 뚫린 일을 다룬 자료입니다.
읽고 쓰는 사이에 끼어드는 갱신 손실이 어느 격리 수준에서 일어나는지 확인할 수 있습니다.
번호 청구를 한 문장으로 끝내는 원자적 upsert 구문을 정의합니다.
연도를 네 자리로 고정하는 표기 기준입니다.
다음 단계
소비 시스템의 저장소 어댑터를 질의 한 문장으로 끝나는 청구로 구현하고, 실제 동시 부하에서 중복과 결번이 없는지 검증합니다.