SQL Server自增列在事务回滚后的增量行为:并非问题
假设一个.NET事务将数据插入到具有自增主键的SQL Server 2005数据库中。当事务中遇到错误时,Rollback()
方法正确地回滚了行插入操作。但是,随后对同一表的插入操作会递增自增列,就好像没有发生回滚一样,从而在序列中产生间隙。
理解自增特性
务必理解,自增数字的设计是非事务性的。这种设计的理由在于,如果其他事务必须等待使用或回滚自增数字才能继续执行,则可能会发生阻塞。
为了说明这一点,考虑以下场景,其中用户1和用户2使用自增字段作为ID列与表A交互:
<code>用户 1 ------------ begin transaction insert into A ... insert into B ... update C ... insert into D ... commit 用户 2 ----------- begin transaction insert into A ... insert into B ... commit</code>
如果用户2的事务在用户1的事务之后发生,即使只是稍微晚一点,他们对表A的插入操作将被迫等待用户1的整个事务完成,仅仅是为了确定来自表A第一次插入的自增数字是否被使用。
结论
因此,自增列在事务回滚后仍然持续递增的行为不是错误,而是一种刻意设计的策略。如果需要精确的顺序自增数字,则应考虑其他机制来生成此类值。
以上是事务回滚后,SQL Server 标识(自动增量)是否继续增量?的详细内容。更多信息请关注PHP中文网其他相关文章!