홈 › SQL 실무 › 07 / 9

채번과 순번 관리

일자별 일련번호, 채번 테이블, 동시 요청
섹션 6진행 0 / 9

6. 정리

업무 번호는 접두어, 날짜, 일련번호로 이루어지고 어려운 것은 일련번호입니다. MAX+1 은 읽기와 쓰기 사이에 틈이 있어 두 세션이 같은 번호를 만듭니다. 주문번호에 PK 나 UNIQUE 를 두어 막고, 중복 오류가 나면 번호를 다시 구해 재시도합니다.

채번 테이블은 biz 와 ymd 마다 행을 두고 UPDATE last_no = last_no + 1 로 올립니다. UPDATE 가 행 잠금을 먼저 잡기 때문에 동시 요청이 줄을 서서 서로 다른 번호를 받습니다. 그날 첫 요청의 행 만들기는 Oracle·MSSQL 은 MERGE, MySQL 은 INSERT IGNORE 로 처리합니다.

잠그면서 읽는 방식은 Oracle·MySQL 의 SELECT ... FOR UPDATE, MSSQL 의 UPDLOCK 힌트이고, 한 문장으로 받으려면 Oracle 의 RETURNING INTO, MSSQL 의 OUTPUT, MySQL 의 LAST_INSERT_ID(식)를 씁니다.

채번을 주문 INSERT 와 같은 트랜잭션에 묶으면 롤백 때 번호도 돌아와 구멍이 없지만 잠금 대기가 길어집니다. 따로 커밋하면 빠르지만 주문이 실패할 때 구멍이 생깁니다. 구멍을 허용하는지가 업무 요구이므로 그것으로 고릅니다. 시퀀스는 빠르고 잠금이 없지만 일자별 리셋이 어렵고 구멍이 생깁니다.

번호 조립은 Oracle 이 TO_CHAR 와 LPAD 와 연결 기호, MySQL 이 CONCAT 과 LPAD 와 DATE_FORMAT, MSSQL 이 RIGHT 와 + 와 CONVERT 스타일 112 입니다. LPAD 와 RIGHT 는 자릿수를 넘으면 조용히 자르므로 자릿수를 넉넉히 둡니다. 다음 레슨은 저장 프로시저와 함수 기초로, 채번 같은 반복 로직을 DB 안에 묶어 두는 방법을 미리 살펴봅니다.