当我尝试在表中插入新行时,如果此事务中发生任何异常,则数据将回滚。
现在,下次成功插入新条目时,AutoIncrement id将使用下一个值进行更新。表示表中两个确定的唯一ID之间存在差距。
有没有有效的方法来解决这个问题?
提前致谢
答案 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的事务也会中止。这意味着中止的交易可能在指定值的序列中留下未使用的“漏洞”。
(强调我的)