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

Dav*_*vid 3 sql-server transactions rollback identity-column

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

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

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

Ric*_*iwi 7

你所追求的将永远不会与标识列一起使用.

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

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

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

declare @next int
update sequence_for_tbl set @next=next=next+1
.. use @next
Run Code Online (Sandbox Code Playgroud)