SQL Server - 即使在回滚的情况下,如何确保身份字段正确递增

时间:2011-04-04 10:36:27

标签: sql-server transactions rollback identity-column

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

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

是否有任何方法可以更改此行为,以确保标识字段是顺序的?

2 个答案:

答案 0 :(得分:7)

您所追求的将永远不会使用标识列。

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

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

出于同样的原因,您通常不希望出现此行为,也不需要高容量表的数字序列。但是,对于非常不常见的单进程表(例如每月一个进程的发票号),可以在MAX(number)+1或类似查询周围放置一个事务,例如

declare @next int
update sequence_for_tbl set @next=next=next+1
.. use @next

答案 1 :(得分:0)