Sql-Server

SqlServer 序列是否保證為並發事務返回不同的值?

  • May 1, 2020

在文件中被告知:

重複驗證僅在記錄完全填充後發生。在某些情況下,這可能會導致在創建過程中將同一編號用於多個記錄,但隨後會被辨識為重複記錄

我不想在這樣的插入查詢中使用該數字:

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

我想在我的 Web 應用程序中獲取該數字並使用它來構造密文。並將加密的程式碼儲存在數據庫中。因此,就我而言,插入時沒有重複檢查。

我需要知道的是,兩個客戶端是否有可能NEXT VALUE FOR幾乎同時呼叫函式並獲得相同的值?或不?(我需要不要發生這種情況)

因此,就我而言,插入時沒有重複檢查。

如果您確實不打算允許重複值,則應UNIQUE在要儲存密文的列上創建一個約束。您的應用程序必須進行編碼以重試因唯一約束錯誤而失敗的插入。

我需要知道的是,兩個客戶端是否有可能幾乎同時呼叫 NEXT VALUE FOR 函式並獲得相同的值?

雖然在正常情況下不太可能NEXT VALUE FOR從同一序列的兩次單獨呼叫中獲得相同的值,但有些事情可能會導致它發生:

  • 序列是用CYCLE選項指定的,並且已經達到最大值(導致它翻轉)
  • 序列已重置 ( ALTER SEQUENCE RESTART)
  • 如文件所述,在同一個語句中多次訪問同一個序列對象每次都會產生相同的值,因此請確保不要做這樣的事情,期望兩個不同的數字:
SELECT 
   NEXT VALUE FOR dbo.TestSequence,
   NEXT VALUE FOR dbo.TestSequence;

您可能也有興趣閱讀Paul White 的序列表

引用自:https://dba.stackexchange.com/questions/266252