5

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

现在,当下次成功插入新条目时,AutoIncrement id 将更新为下一个值。表示表中两个连续的唯一 ID 之间存在间隙。

有什么有效的方法可以克服这个问题吗?

提前致谢

4

1 回答 1

13

答案不得不说——

IDENTITY 列的整个想法是没有意义,并且与事务无关 - 以便可以在不关心其他事务是否回滚的情况下抛出数字。想象一个每秒 1000 次插入的系统为每个事务(插入)等待 10 毫秒以决定它是否会提交!(仅供参考 10 毫秒 * 100 = 1 秒)

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

即使在 2012 年之前,您甚至不需要回滚即可使用IDENTITY 值 - 请参见此处https://stackoverflow.com/a/16156419/573261


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

PostgreSQL 序列

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

(强调我的)

于 2013-05-03T12:35:48.077 回答