我有一本书.net事务,并将SQL插入SQL Server 2005数据库.该表有一个标识主键.

当事务中发生错误时,调用Rollback().行插入被正确回滚,但是下次我向表中插入数据时,标识会增加,就好像从未发生回滚一样.因此,本质上,身份序列中存在差距.有没有办法让Rollback()方法找回丢失的身份?

我的方法不对吗?

推荐答案

如果你仔细想想,自动递增数字should not可能是事务性的.如果其他交易必须等待,看看自动编号是否将被使用或"回滚",它们将被使用自动编号的现有交易阻止.例如,在表A下面使用pID列的自动编号字段来考虑我的pSueDO代码:

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的自动编号.

这是一个功能,不是一个bug.我建议使用另一种方案来生成自动编号,如果你需要它们是紧密顺序的.

Sql相关问答推荐

获取家谱树中第一次出现的特定信息,然后停止

如何重用表值用户定义函数调用的结果?

如何并行SELECT和RESET?

SQL基于多个值 Select 单行

如何优化我的功能以减少花费的时间?

仅在特定字符串之后提取两个圆括号之间的计量单位文本

如何嵌套两条SQL语句

是否可以为表中的所有列生成散列值?

根据是否出现过零来筛选数据(跨多行)

SQL递归.硬币兑换问题.-try 使用递归解决硬币找零问题

使用与JOIN一起使用的查询后进行分页和排序

SQL仅返回第一个字母在A-Z之间的值

当 ansible 变量未定义或为空时,跳过 sql.j2 模板中的 DELETE FROM 查询

使用 XML 作为 SQL 表

替换SQL Server XML中多处出现的 node 值

具有分组条件的不同计数 (DAX)

SQL Server:时态表并在运行时添加计算列

计算 BigQuery 中列的中值差 - 分析函数不能作为聚合函数的参数

如何按日期和位置对最近 3 个报告日期的 SQL 查询结果进行透视?

使用标准SQL 触发更新当前日期