2016-09-12 10 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 = '...' 

これは私が唯一の1つの行を更新するだろう任意の時点でのように動作しますが、主キーです:

は、今私は、次の構文がありますがわかりました。

私の質問は:UPDATE ... OUTPUTステートメントのようなアトミックな操作で、2人のクライアントが同時呼び出しで同じ値を取得しないようにしますか?

+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と述べた。 –