C# SQL Server序列间隙

C# SQL Server序列间隙,c#,sql,sql-server,sqltransaction,C#,Sql,Sql Server,Sqltransaction,我有一个序列,用于设置表的事务对开: 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 令人惊讶的是,表格中有空白,所

我有一个
序列
,用于设置表的事务对开:

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
令人惊讶的是,表格中有空白,所以缺少对开本

例如:

  • 898897894892890889
这意味着发生了一些事情。为了提供更多信息,我使用的
INSERT
存储过程在
INSERT-INTO…

DECLARE @numfolio int

SELECT @numfolio = NEXT VALUE FOR  Seq.Folio
在保存应用程序中的信息时,我使用了数据库事务,因此,如果一切顺利,那么应用程序将执行
提交事务
,否则,我将执行
回滚事务

我认为问题的根源在于事务,因此当出现错误时,序列的
下一个值
已经生成,并且
回滚
对该错误没有影响


如何解决这个问题,以获得一个没有间隙的完美序列,有什么线索吗?

所以,关于序列,您应该了解一些事情

  • 它不是事务性的,因此是的,一旦事务检索到值,回滚不会恢复它
  • 序列的值是分批分配的,因此假设您将缓存大小设置为10,获取一个值,然后重新启动服务器,将有10个间隔

  • 至于如何获得一个完美的序列,那么,可能唯一的方法就是在可序列化事务中从表中获取最大值。现在你应该问自己的问题是“它们真的需要顺序吗?”

    我真的很喜欢这个答案!!你完全正确。。。没有太大的需要顺序,事实上我很担心,但现在你告诉我如何工作,然后没有问题!!谢谢