我有一个 .net 事务,其中包含对 SQL Server 2005 数据库的 SQL 插入。该表有一个身份主键。
当事务中发生错误时,将调用Rollback()
。行插入已正确回滚,但是下次我将数据插入表时,标识会增加,就好像回滚从未发生过一样。因此本质上身份序列中存在间隙。有什么方法可以让 Rollback()
方法收回丢失的标识吗?
我是否没有以正确的方式处理这个问题?
最佳答案
如果您考虑一下,自动递增数字不应该是事务性的。如果其他事务必须等待查看自动编号是否将被使用或“回滚”,则它们将被使用自动编号的现有事务阻止。例如,请考虑下面的伪代码,其中表 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 中的自动编号。
这是一个功能,而不是一个错误。如果您需要它们紧密连续,我建议使用另一种方案来生成自动编号。
关于.net - 即使事务回滚,SQL 标识(自动编号)也会增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/282451/