如何在sql中发生回滚时重置自动增量ID

时间:2013-05-03 12:29:41

标签: sql-server

当我尝试在表中插入新行时,如果此事务中发生任何异常,则数据将回滚。

现在,下次成功插入新条目时,AutoIncrement id将使用下一个值进行更新。表示表中两个确定的唯一ID之间存在差距。

有没有有效的方法来解决这个问题?

提前致谢

1 个答案:

答案 0 :(得分:13)

必须回答 -

IDENTITY列的整个想法是有意义,并且与事务无关 - 这样可以抛出数字,而无需关注其他事务是否回滚。想象一下,每个事务(插入)每秒1000次插入系统被保持10ms,以决定它是否会提交! (fyi 10ms * 100 = 1s)

注意:在SQL Server 2012(撰写本文时的最新SP /补丁级别)中,此处标注了与身份相关的“{3}}”功能。

即使在2012年之前,您甚至不需要回滚到消费 IDENTITY值 - 请参阅此处on Connect


这也适用于其他主要的RDBMS,原因相同,例如

https://stackoverflow.com/a/16156419/573261

  

重要说明:为了避免阻塞从同一序列获取数字的并发事务,从不回滚nextval操作;也就是说,一旦获取了一个值,它就被认为是使用的,即使稍后执行nextval的事务也会中止。这意味着中止的交易可能在指定值的序列中留下未使用的“漏洞”

(强调我的)