从SEQUENCE原子检索顺序范围

时间:2016-04-04 16:26:38

标签: sql-server tsql

我有一个序列,我想以原子方式从中检索几个连续值。

据我所知,序列不支持交易。

标准NEXT VALUE FOR syntax无法提供帮助,而在其他数据库中则可以这样做。

我找到了sp_sequence_get_range function,但我不确定它是否是原子的。测试此类案例非常棘手。

有可能吗?

1 个答案:

答案 0 :(得分:2)

简而言之,是的,序列具有您正在寻找的属性。

现在有点为什么。在它们的基础上,序列只是系统表中的一行,其中包含一个表示序列中当前值的列(除其他外)。通常,当您调用NEXT VALUE FOR时,SQL Server将获取当前值,将该值递增1,最后返回获取的值。当你使用sp_sequence_get_range时,它会做同样的事情,除了它将值增加你要求的范围的大小(例如,如果你用@range_size = 10调用它,它会将值递增10)。

我很好奇的一件事是,包含sp_sequence_get_range过程调用的事务的回滚是否也回滚了该范围的分配。我很高兴地报告它没有。因此,您不必担心对该过程的两次调用会获得相同的值。

最后,我提醒你注意无间隙序列的谬误。如果你得到一个范围并且该线程因任何原因而死(例如你的应用程序终止,SQL Server预期或意外关闭),那个序列将永远丢失。也就是说,没有放弃"未使用的"回到队列中,以便下一个范围调用获得该范围。