gpt4 book ai didi

c# - SQL Server 序列间隙

转载 作者:行者123 更新时间:2023-11-30 14:59:41 26 4
gpt4 key购买 nike

我有一个 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. 它不是事务性的,所以是的,一旦事务检索到值,回滚就不会恢复它。
  2. 序列的值是分批分配的,假设你的缓存大小设置为 10,抓取一个值,然后重新启动服务器,会有 10 的间隔。

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

关于c# - SQL Server 序列间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16472431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com