SQL Server序列差距

时间:2013-05-09 22:48:37

标签: c# sql sql-server sqltransaction

我有一个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对此没有影响。

有任何线索如何解决这个问题,以便拥有一个没有间隙的完美序列?

1 个答案:

答案 0 :(得分:5)

所以,你应该了解一些关于序列的事情。

  1. 这不是事务性的,所以是的,一旦事务检索到值,回滚就不会恢复它。
  2. 序列的值是批量分配的,所以说你的缓存大小设置为10,抓取一个值,然后重新启动服务器,差距将为10。
  3. 至于如何获得完美的序列,很可能,唯一可行的方法是从可序列化事务中的表中获取最大值。现在你应该问自己的问题是“他们真的需要顺序吗?”。