2010-03-27 110 views
3

我有一個SqlServer 2008表具有一個主鍵(IsIdentity =是)和三個其他字段組成一個唯一鍵約束。主鍵身份價值增量在唯一鍵約束違規

此外,我有一個存儲過程插入一個記錄到表中,我通過C#使用SqlConnection對象調用存儲過程。

C#的存儲過程調用工作正常,但是當C#存儲過程調用違反唯一鍵約束我已經注意到有趣的結果....

當存儲過程調用違反唯一鍵約束,則拋出SQLException - 這並不令人驚訝和冷靜。但是,我注意到下一個成功添加到表中的記錄的PK值並不比之前的記錄多一個 -

例如:假設表中有五個記錄,其中PK值爲1, 2,3,4和5. sproc試圖插入第六條記錄,但是違反了唯一鍵約束,因此第六條記錄未被插入。然後這個sproc嘗試插入另一個記錄,這次它是成功的。 - 這個新紀錄的PK值是7而不是6.

這是正常行爲嗎?如果是這樣,你能給我一個這樣的原因嗎? (如果記錄未能插入,爲什麼PK指數會遞增?)

如果這不是正常行爲,您能否給我提示我爲什麼會看到這些症狀?

回答

6

是的,這是正常的。

想象一下正在進行的事務,這是SQL Server上運行的潛在操作順序。

  1. ID使用了1,2,3,4,5。
  2. 客戶端A開始交易。
  3. 客戶端A執行插入但不提交(ID 6)。
  4. 客戶端B開始交易。
  5. 客戶端B執行插入但不提交。 (ID 7)。
  6. 客戶端A回滾。
  7. 客戶端B提交。

由於此行爲存在(不一定存在)的可能性,因此您看到ID 6在插入失敗時會被跳過。

+0

是的,你永遠不能指望標識字段永不跳過值。 – HLGEM 2010-08-23 21:04:10

相關問題