一尘不染

即使事务回滚,SQL身份(自动编号)也会增加

sql

我有一个带有SQL插入SQL Server 2005数据库的.net事务。该表具有一个身份主键。

当事务内发生错误时,将Rollback()被调用。行插入将正确回滚,但是,下次我将数据插入表时,标识将增加,就好像从未发生过回滚一样。因此,本质上在同一性序列中存在缺口。有什么方法可以让该Rollback()方法回收丢失的身份?

我不是用正确的方法吗?


阅读 124

收藏
2021-05-05

共1个答案

一尘不染

如果您考虑一下,则自动递增号 不应
是事务性的。如果其他事务必须等待以查看是否要使用或“回滚”自动编号,则使用该自动编号的现有事务将阻止它们。例如,考虑下面我的表A的伪代码,对ID列使用一个自动编号字段:

User 1
------------
begin transaction
insert into A ...
insert into B ...
update C ...
insert into D ...
commit


User 2
-----------
begin transaction
insert into A ...
insert into B ...
commit

如果用户2的事务在用户1的事务之后一毫秒开始,那么他们向表A的插入将不得不等待用户1的整个事务完成,以查看是否使用了从第一次插入A的自动编号。

这是一个功能,而不是错误。如果您需要自动编号,我建议使用另一种方案来生成自动编号。

2021-05-05