.net - 即使事务回滚,SQL 标识(自动编号)也会增加

标签 .net sql sql-server-2005 transactions identity-column

我有一个 .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/

相关文章:

sql-server-2005 - SQL Server 2005 SSIS 数据传输 SQL 到 Excel 损坏 Excel 文件

C# Winforms 应用程序从命令提示符和调试器中打开,但不是从文件资源管理器中打开

.net - HttpListenerContext.AcceptWebSocketAsync 的有效子协议(protocol)是什么?

mysql - 如何在一天内查找复合键的唯一行

sql-server-2005 - 从 SQL Server 2005 复制到 SQL Server 2012

c# - 使用 Entity Framework 加入 View 时使用 .Include()

c# - 在 XElement 上选择具有命名空间别名而不是 URI 的命名空间 XML 节点属性

.NET TCPClient 连接状态

php - mysql 特定的 select with order

sql - 优化mysql表?