2016-09-12 3 views
3

많은 경우 SQL Server의 일련 번호에서 고유 한 식별자를 얻어야합니다. 내가 가지고있는 것은 숫자 시리즈 이름, 최소값, 최대 값 및 현재 값을 포함하는 테이블입니다. 원자력 진술?

Series  Min  Max  Current 
------------------------------------------- 
Testseries 1   999  23 

는 이제 안전하게 현재 값을 증가시키고 출력하는 UPDATE ... OUTPUT 문을 사용하십시오. 다른 모든 접근법 (예 : UPDATE 현재 및 SELECT)은 조만간 경쟁 조건을 유발할 수 있습니다. Series

DECLARE @newId INT 
UPDATE Numberseries 
SET 
    @newId = Current += 1 
WHERE 
    Series = '...' 

이 내가 하나 개의 단일 행을 업데이트 할 것입니다 임의의 지점에서 같이 일하는 것이가, 기본 키 :

는 지금은 다음 구문 거기에 발견.

내 질문은 : 이것도 UPDATE ... OUTPUT 문과 같은 원자 적 연산으로 두 클라이언트가 동시 호출에서 동일한 값을 얻지 못하게 할 수 있습니까?

+1

[시퀀스] (https://msdn.microsoft.com/en-us/library/ff878091.aspx)에 대한 설명을 읽어보십시오. SQL Server는 기본적으로 이러한 종류의 작업을 지원합니다. – Shnugo

+0

@Shnugo 힌트를 보내 주셔서 감사합니다.하지만 불행히도 고객은 여전히 ​​SQL Server 2008에 있습니다. –

+0

@Shnugo 감사합니다. 잊어 버렸습니다. –

답변

0

UPDATE은 실제로 원자가 아님 (적어도 일부 DBS는) 테이블을 사용하면 안됩니다. INSERT 값을 사용하고 해당 값에 UNIQUE- 제약 조건이 있으면이 값으로 도망 갈 수 있습니다. 당신은 재 시도 후 충돌해야합니다.

진짜 해결책은 SEQUENCE을 사용하는 것입니다. 이것이 바로 그 이유입니다.

+0

시퀀스를 지원하지 않는 RDBMS에 있지 않는 한 - 나 라고 말했다. –