주문이력을 발생시킬때 pk중복오류가 발생하였는데, 이 오류를 기존 해결하였던 방안으로 접근하는 것이 바람직하지 않다고 판단되어 다른 방향으로 해결방안을 모색하였고, 적용하였다.
첫번째 해결방안은 채번테이블 설계의 보완이다.
현재 채번테이블은 구분코드, 체결일자, 시리얼 번호로 구성되어 있고 신규 채번을 진행할 때 마다 구분코드, 체결일자에 대한 시리얼 번호를 조회해온다.
주문을 발생시킨 후에 해당 시리얼 번호를 +1을 하며 채번값을 증가하는데, 사실 동시성 관점에서 이 과정도 무결성을 보장할 수 없다.
이럴 경우 문제가 동일 구분코드(상품, 처리항목 등), 동일 체결일자 환경에서 현재 발생한 문제처럼 중복오류가 발생할 수 있다. 즉 구분코드를 기반으로 일련번호를 채번한다 하더라도 수많은 사용자에 대해 유일성을 보장할 수 없으므로 중복오류가 발생하였던 것이다.
나는 이를 위해 채번테이블 설계 보완을 생각하였고, 그 방안이 구체적이지 않은 구분코드 대신에 사원번호를 사용하는 안을 제시하였다.
이럴 경우 아무리 많은 사용자가 들어와도, 사용자의 유일성을 무조건 보장할 수 있으며 채번테이블에서도 컬럼을 통한 목적성을 확인할 수 있기에 설계적으로나 안정성으로나 더 유리할 것으로 생각하였다.
이 결과로 채번하는 항목이 변경되었다.
현재 채번 시
SELECT SN
FROM TB_SN
AND CRTR_YMD = ${crtrYmd}
AND NO_SE_CD = ${noSeCd}
변경 후
SELECT SN
FROM TB_SN
AND CRTR_YMD = ${crtrYmd}
AND EMPL_NO = ${emplNo}
이 일이 사실 좀 오래되긴 했는데 당시 공수가 별로 들지도 않고, 협의할 때 안정성을 최우선으로 고려하였기 때문에 이 방안이 채택될 수 있었다.
또한 동시성 제어는 db이력을 활용하는 방안도 있는데, 대용량처리에서 사용하였던 방식과 꽤 유사한 점이 많이 보여서 활용도가 높아보였다.