2011-07-18 20 views
2

SQL Serverデータベースにテーブルがあります。 Location(整数)とCaseNumber(整数)の2つの部分からなる自然なキーを持ちます。新しいレコードを作成するときに、場所を指定してCaseNumberを生成して、任意の場所ですべてのケース番号が一意になり、ギャップがないようにします。テーブルのレコードは決して削除されません。2つの部分のキーを形成する別の列に基づいて増分番号を作成

これを実行して同時更新が安全であることを確認するにはどうすればよいでしょうか?

+1

は、いくつかの掘削後、私が見つけた[この回答](http://stackoverflow.com/questions/1223287/per-entity-autoincrement-field-in-sql-server) 。それはまだ何も答えられていないようです:) – Jacob

答えて

0

これは、以前にカバーされているが、ここではいくつかの一般的な考え方は以下のとおりです。

Location, CaseNumberをカバーUNIQUE INDEXを追加します。これにより、並行処理のチェックが失敗した場合には、偽装を防ぐことができます。

トランザクションで新しい最大値をチェック/挿入するコードをカプセル化します。それはかなりではありませんが、同時実行性に問題がないことを保証する方法です。すなわち

..

DECLARE @Max int 
BEGIN TRAN 
SET @Max = (SELECT MAX(CaseNumber) FROM MyTable WITH (TABLOCK) 
      WHERE Location = @Location) + 1 

INSERT INTO MyTable 
@Location, @Max 

COMMIT TRAN 
関連する問題