우리는 새로운 사람을 데이터베이스에 추가 할 때 고유 번호를 할당해야한다는 요구 사항이 있습니다. 이 번호는 시스템이 가동 될 때 정의 된 번호부터 시작합니다. 따라서 클라이언트가 "Start at 500,000!"이라고 말하면 할당 된 첫 번째 ID는 500000입니다.DB로 숫자 증가 처리하기
쉬운 자동 증가 악마입니다.
그러나이 ID
은 Account Number
이며 외부 고객에게 전송되어 해당 계정을 계정에 연결합니다. 아이디어는 자동 inc 기본 키를 사용했을 수도 있지만 PK를 외부 '개인 번호'로 사용하는 것이 좋지 않다고 생각합니다.
누군가가 우리가 그 번호를 추가 할 사람 테이블에 auto inc pk와 id가있는 테이블을 가지고 있다고 언급했습니다. 그러나 그것은 이상하게 보입니다.
제 생각에는 실제로 행이 하나 뿐인 시스템의 시스템 설정이 포함 된 settings
테이블에 새 열을 추가하는 것이 좋습니다. 열은 INT
이고 NextAvailableId
이라고 할 수 있습니다. 행의 모든 열은 (RowVersion
) 인 Version
열입니다.
내 계획은 단순히 다음을 수행 할 GetNextId
또는 무엇인가라는 함수를 만드는 것입니다 :
- 라는 변수를 만듭니다
@AssignedID
- 로부터의
NextAvailableId
를 가져옵니다@Version
- 라는 변수를 만듭니다 설정 테이블뿐만 아니라 버전.
NextAvailableId = AssignedID + 1 WHERE version = @Version
- 설정 설정 테이블
Set AssignedID = NextAvailableId
- 업데이트, 업데이트 된 행 수를 확인합니다. 1 일 경우 다른 프로세스가 ID를 받기 전에 최신 ID를 가져 와서 증분하여 다시 테이블에 저장합니다.
- 업데이트 된 행 수가 0 인 경우 - 누군가가 우리 앞에 번호를 부여 했으므로 업데이트 된 행이있을 때까지 다시 시도하십시오.
내 개인에게 '계좌 번호'를 지정하는 것이 안전하고 유효한 계획 인 것 같습니까?
사실 그 사람이나 계정 코드는 없습니다. 별도의 시스템에 저장하기 위해 사람에게 적용해야하는 공급 업체 ID입니다. Person과 Account를 (가난한) 예제로 사용하십시오.
내가해야 할 일은 '계정 번호'의 고유 한 할당을 처리하는 방법을 찾는 것입니다. 수동 방식이 좋지 않은 아이디어이고 더 좋은 방법이 있다면 - 그 것이 많은 도움이 될 것입니다.
당신이 당신의 자신의 * 매뉴얼 * 증가 방식을 사용하도록 선택하는 경우, 당신이해야합니다 ** 확신 ** 당신의 증가 기능도 부하가 ** 동시성 안전 **입니다. 그리고 ** 성취하기가 쉽지 않습니다 **! –
감사합니다. @marc_s. 그래, 그게 내가하려는거야. 따라서 행 버전을 사용하여 사용 가능한 ID를 확보하는 것이 나에게 꽤 안전 해 보입니다. 하지만 뭔가를 놓친 것일까 요? 잠그고있어? – Craig
[이 다른 질문을 참조하고 Remus Rusanu의 대답] (http://stackoverflow.com/questions/5083846/sql-server-2005-using-generated-sequences-instead-of-identity-columns) 방법 ** 안전하게 ** –