我有一个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
并且存在间隙的意外,因此表中缺少对开页。
示例:
这意味着事情正在发生。为了提供更多信息,我使用的INSERT
存储过程在INSERT INTO...
DECLARE @numfolio int
SELECT @numfolio = NEXT VALUE FOR Seq.Folio
从我的应用程序保存信息时,我使用了数据库事务,所以如果一切顺利,那么应用程序会执行COMMIT TRANSACTION
,如果不是,我会执行ROLLBACK TRANSACTION
。
我认为问题的根源是事务,因此当出现错误时,序列的NEXT VALUE
已经生成,ROLLBACK
对此没有影响。
有任何线索如何解决这个问题,以便拥有一个没有间隙的完美序列?
答案 0 :(得分:5)
所以,你应该了解一些关于序列的事情。
至于如何获得完美的序列,很可能,唯一可行的方法是从可序列化事务中的表中获取最大值。现在你应该问自己的问题是“他们真的需要顺序吗?”。