SQL Server的序列缺口(SQL Server Sequence Gaps)

2019-09-02 10:29发布

我有一个SEQUENCE ,我用来设置表的交易开本:

CREATE SEQUENCE [Seq].[Folio] 
 AS [bigint]
 START WITH 114090
 INCREMENT BY 1
 MINVALUE -9223372036854775808
 MAXVALUE 9223372036854775807
 CACHE

今天只是好奇,我做了:

SELECT folio 
FROM transactions
ORDER BY folio DESC

什么是惊喜有差距,所以有在表中缺少对开。

例:

  • 898,897,894,892,890,889 ...

这意味着,有事情发生。 为了给更多的信息,在INSERT ,我用有前以下存储过程INSERT INTO...

DECLARE @numfolio int

SELECT @numfolio = NEXT VALUE FOR  Seq.Folio

当保存从我的应用程序的信息,我使用的数据库的事务,所以如果一切顺利,那么该应用程序不会在COMMIT TRANSACTION如果不是我做的ROLLBACK TRANSACTION

我认为,问题的根源是事务,所以当存在一个错误NEXT VALUE序列已经生成和ROLLBACK有没有影响。

任何线索如何解决这个才能有没有间隙完美的序列?

Answer 1:

因此,有你应当理解有关序列的一些事情。

  1. 这不是事务性的,所以是的,一旦交易检索值,回滚不会恢复。
  2. 为序列的值被分配批次,所以说,你有你的缓存大小设置为10,抢一个值,然后重新启动服务器,将有10个差距。

至于如何得到一个完美的序列,那么,可能你能做到这一点的唯一途径是通过获取在串行事务从表中的最大值。 现在,你应该问自己的问题是:“他们真的需要是连续的?”。



文章来源: SQL Server Sequence Gaps