2011-07-18 26 views
2

我在SQL Server數據庫中有一個表。它在位置(一個整數)和CaseNumber(也是一個整數)上有一個由兩部分組成的自然鍵。當我創建新記錄時,我想指定位置併爲我生成CaseNumber,這樣對於任何一個位置,所有個案號碼都是唯一的,遞增的並且沒有間隙。表中的記錄永遠不會被刪除。基於另一列創建遞增數字以形成兩部分密鑰

確保安全併發更新的最佳方法是什麼?

+1

一些挖後,我發現[這個答案](http://stackoverflow.com/questions/1223287/per-entity-autoincrement-field-in-sql-server) 。似乎沒有什麼沒有答案,所以:) – Jacob

回答

0

此之前已經覆蓋,但這裏有一些總體思路:

添加UNIQUE INDEX覆蓋Location, CaseNumber。如果你的併發檢查失敗,這將防止愚蠢行爲。

封裝您的代碼以在交易中檢查/插入新的最大值。這不是很好,但它如何確保不會出現併發問題。

即..

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