다른 번호 유형 중 인시던트 번호를 사용하는 응용 프로그램이 있습니다. 이 숫자는 카운터의 현재 값을 포함하는 "Number_Setup"테이블에 저장됩니다.SQL 서버 데이터베이스에서 고유 번호 확인
응용 프로그램에서 새 인시던트를 생성하면 number_setup 테이블에서 필수 카운터 행을 가져옵니다 (카운터는 매일, 매주 등 재설정 될 수 있으며 int로 저장됩니다). 그런 다음 카운터를 증가시키고 새 값으로 행을 업데이트합니다.
응용 프로그램은 다중 사용자 (한 번에 약 100 명의 사용자뿐 아니라 100 개의 문제 레코드를 실행하고 각각의 인시던트 번호를 요청하는 SQL 작업)입니다. 인시던트 테이블에는 중복되지 않아야하는 중복 인시던트 번호가 있습니다.
저장된 proc은 다음 카운터를 검색하는 데 사용됩니다.
SELECT @Counter = counter, @ShareId=share_id, @Id=id FROM Number_Setup WHERE [email protected] AND Counter_Type='I' IF isnull(@ShareId,0) > 0 BEGIN -- use parent counter SELECT @Counter = counter, @ID=id FROM Number_Setup WHERE [email protected] END SELECT @NewCounter = @Counter + 1 UPDATE Number_Setup SET Counter = @NewCounter WHERE [email protected]
지금 포위 한 그 거래와 블록,하지만 난 카운터 어쨌든 읽을 수 있도록 여전히 공유 잠금이 있다고 생각대로 '100 %, 문제가 해결됩니다 완전히 확실하지 않다.
아마도 내가 UPDATE 문
UPDATE Number_Setup SET Counter = @NewCounter WHERE Counter = @Counter IF @@ERROR = 0 AND @@ROWCOUNT > 0 COMMIT TRANSACTION ELSE ROLLBACK TRANSACTION
나는이
내가 넣을 수없는 등 금융 애플리케이션에서 송장 번호가 일반적인 문제입니다 확신에서, 카운터가 업데이트되지 않았 음을 확인하실 수 있습니다 코드의 논리와 그 수준에서 잠금을 사용하십시오. 나는 또한 홀록 (HOLDLOCK)에 잠겨 있었지만 응용이 확실치 않습니다. 두 개의 SELECT 문에 넣어야합니까?
복제본이 생성되지 않도록하려면 어떻게해야합니까?
어떤 버전의 Sql Server입니까? – RBarryYoung
현재, 2000. –