web-dev-qa-db-ja.com

SqlServerシーケンスは、並行トランザクションに対して異なる値を返すことが保証されていますか?

ドキュメンテーションではそれは言われています:

重複検証は、レコードが完全に入力された後にのみ行われます。これにより、作成中に同じ番号が複数のレコードに使用され、重複として識別される場合があります。

次のような挿入クエリでその番号を使用したくありません。

INSERT Test.Orders (OrderID, Name, Qty)  
    VALUES (NEXT VALUE FOR Test.CountBy1, 'Tire', 2) ; 

私は自分のWebアプリケーションでその数を抑制し、それを使用して暗号化されたテキストを構築したいと考えています。暗号化されたコードをデータベースに保存します。したがって、私の場合、挿入中に重複チェックはありません。

私が知る必要があるのは、2つのクライアントがNEXT VALUE FOR関数をほぼ同時に呼び出して同じ値を取得する可能性があるかどうかです。か否か? (私はこれが起こらないようにする必要があります)

2

したがって、私の場合、挿入中に重複チェックはありません。

重複する値を許可するつもりがない場合は、暗号化されたテキストを格納する列にUNIQUE制約を作成する必要があります。一意制約エラーで失敗した挿入で再試行するように、アプリケーションをコーディングする必要があります。

知っておくべきことは、2つのクライアントがNEXT VALUE FOR関数をほぼ同時に呼び出して同じ値を取得する可能性があるかどうかです。

通常の状況では、同じシーケンスからNEXT VALUE FORへの2つの別々の呼び出しで同じ値を取得することはほとんどありませんが、それが発生する可能性があります。

  • シーケンスはCYCLEオプションで指定され、最大値に達しました(ロールオーバーが発生します)
  • シーケンスがリセットされました(ALTER SEQUENCE RESTART
  • 文書化されているように、同じstatementで同じシーケンスオブジェクトに複数回アクセスすると、毎回同じ値が生成されるので、このようなことをしないでください2つの異なる番号:
SELECT 
    NEXT VALUE FOR dbo.TestSequence,
    NEXT VALUE FOR dbo.TestSequence;

Paul Whiteによる Sequence Tables を読むことにも興味があるかもしれません。

4
Josh Darnell