SqlServer 序列是否保证为并发事务返回不同的值?

Sha*_*ghi 3 sql-server concurrency sequence isolation-level

文档中指出:

仅当记录完全填充后才会发生重复验证。在某些情况下,这可能会导致在创建过程中将同一个编号用于多个记录,但随后会被识别为重复项

我不想在像这样的插入查询中使用该数字:

INSERT Test.Orders (OrderID, Name, Qty)  
    VALUES (NEXT VALUE FOR Test.CountBy1, 'Tire', 2) ; 
Run Code Online (Sandbox Code Playgroud)

我想在我的网络应用程序中获取该数字并使用它来构造密文。并将加密后的代码存储在数据库中。因此,就我而言,插入时没有重复检查。

我需要知道的是,两个客户端是否有可能NEXT VALUE FOR几乎同时调用函数并获得相同的值?或不?(我需要不要发生这种情况)

Jos*_*ell 5

因此,就我而言,插入时没有重复检查。

如果您确实不想允许重复值,则应该对UNIQUE要存储密文的列创建约束。您的应用程序必须进行编码,以便重试因唯一约束错误而失败的插入。

我需要知道的是,两个客户端是否有可能几乎同时调用 NEXT VALUE FOR 函数,并获得相同的值?

虽然在正常情况下不太可能在NEXT VALUE FOR同一序列的两次单独调用中获得相同的值,但有些事情可能会导致这种情况发生:

  • 序列是用CYCLE选项指定的,并且已达到最大值(导致其翻转)
  • 序列已重置 ( ALTER SEQUENCE RESTART)
  • 如文档所述,在同一语句中多次访问同一序列对象将每次产生相同的值,因此请确保不要执行这样的操作,期望有两个不同的数字:
SELECT 
    NEXT VALUE FOR dbo.TestSequence,
    NEXT VALUE FOR dbo.TestSequence;
Run Code Online (Sandbox Code Playgroud)

您可能还有兴趣阅读Paul White 所著的《序列表》