首页 > 解决方案 > 即使从多个连接同时调用,SQL Server 序列是否保证始终生成唯一值?

问题描述

这是一个后续问题:SQL Server 序列线程安全吗?

我有两个单独的存储过程调用相同的序列。存储过程从 SSIS 包“并行”启动。两个存储过程之间没有任何形式的同步(除了我保证它们永远不会更新相同的行,即使它们正在更新同一个表)。话虽如此,两个存储过程不能或多或少地同时调用该序列并没有什么特别的原因。我的问题是关于在这种情况下会发生什么。

在链接问题的情况下,OP 有几个生产者应用程序同时插入到表中,并且想知道它们是否可以“指望”它们在进程之间是连续的(即,如果生产者 2 首先调用序列,它的ID 将小于生产者 3)。(由于生成 ID 和存储 ID 是单独的步骤,因此最终不是这种情况)。

相同的逻辑可能适用于我的案例(由于我也在单独的步骤中生成和存储它们,因此我不能指望它们具有任何特定的“顺序”)。然而,就我而言,我并不特别关心它们是否是连续的,只是它们是独一无二的。

我可以指望这种情况吗?SQL Server 序列是否保证总是产生唯一的值(即使从不同的连接或多或少同时调用),或者这里可能存在一些竞争条件,这将不再是这种情况?

编辑:如果重要的话,最终可以将相同的序列号添加到多行(尽管它总是会添加到至少一个)。我从序列中获取数字,然后执行更新查询以将其添加到我希望它成为一部分的行中。

标签: sqlsql-server

解决方案


如果我没看错,您只是在确保它们是唯一的(例如:您希望它们成为主键?)。如果是这样,那是正确的。就保证订单而言,你是正确的,有条件,尤其是。在负载下,它们不会按特定顺序排列。听起来这对你来说不是一个大问题。只要你正确地拉下一个值,你就是安全的。

当我查看创建的序列时,我认为它们就像 Oracle 中的自动编号,您必须在其中提取值然后使用它,而不是 SQL Server 中的 IDENTITY(尽管有一些方法可以增加 IDENTITY 以便稍后“填补漏洞” ,因此可以以相同/相似的方式使用它)。

我没有检查内部结构,但我想基本序列概念在引擎盖下用于 IDENTITY,因为这些想法基本上是相同的,除了 IDENTITY 附加到表中的一个字段。


推荐阅读