【问题标题】:SQL Server Sequence GapsSQL Server 序列间隙
【发布时间】:2013-05-09 22:48:37
【问题描述】:

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

任何线索如何解决这个问题以获得完美的无间隙序列?

【问题讨论】:

    标签: c# sql sql-server sqltransaction


    【解决方案1】:

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

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

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

    【讨论】:

    • 我真的很喜欢这个答案!!你是完全正确的......没有很大的需要顺序,实际上我很担心它,但现在你告诉我它是如何工作的,那就没问题了!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2021-01-27
    • 2012-04-16
    相关资源
    最近更新 更多