3

在 SQL Server 中,如果涉及插入新行的事务被回滚,则会在标识字段中跳过一个数字。

例如,如果Foos表中的最高 ID 为 99,那么我们尝试插入新Foo记录但回滚,则 ID 100 被“用完”,下一Foo行将编号为 101。

有什么方法可以改变这种行为,以保证身份字段是连续的?

4

2 回答 2

7

您所追求的永远不会与身份列一起使用。

它们被设计为“放弃”并忘记,设计使它们不会导致等待或死锁等。该属性允许 IDENTITY 列用作高度事务性系统中的序列,没有延迟或瓶颈。

确保没有间隙意味着没有办法实现每秒 100 次插入的系统,因为要确定第一次插入是否要回滚需要很长的队列。

出于同样的原因,您通常不需要这种行为,也不需要这种用于大容量表的数字序列。但是,对于非常罕见的单进程表(例如每月单个进程的发票编号),可以将事务围绕MAX(number)+1或类似查询放置,例如

declare @next int
update sequence_for_tbl set @next=next=next+1
.. use @next
于 2011-04-04T10:39:06.477 回答
0

即使有事务回滚,SQL 标识(自动编号)也会增加

于 2011-04-04T10:40:25.260 回答