Sql-Server
SqlServer 序列是否保證為並發事務返回不同的值?
在文件中被告知:
重複驗證僅在記錄完全填充後發生。在某些情況下,這可能會導致在創建過程中將同一編號用於多個記錄,但隨後會被辨識為重複記錄
我不想在這樣的插入查詢中使用該數字:
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 的序列表。