当前位置: 首页 > 面试题库 >

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

苏鸿志
2023-03-14
问题内容

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

当事务内发生错误时,将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的自动编号。

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



 类似资料:
  • 在上面的代码中,我将hibernate与mysql一起使用,hibernate会话由SpringSessionContext管理(在事务边界下使用SessionFactory.CurrentSession类) 下面的镜像(dao层)是直接的用例,但是异常没有回滚,我从简单的服务层调用这个方法(即服务层调用dao层进行CRUD操作),我了解了spring在事务管理上的代理机制,在这种情况下,下面的镜

  • 我在一家spring boot hibernate JPA个人项目书店工作。我面临一个问题,即使用@Transactional注释注释的方法即使在运行时异常的情况下也无法回滚事务。我使用的是spring boot版本1.5.1、hibernate版本5、java版本11 下面是bean配置文件代码: 下面是BooK模型文件代码 下面是商店型号代码 下面是BookDaoImpl代码 下面是Store

  • 情景故事时间: 我“继承”了一个程序,一个用于访问数据库的相当简单的webservice。该程序在某个地方有一个缺陷:它试图更新一个没有更新授权的表。该程序只具有更新数据库队列的权限(Oracle),以保存谁访问了什么信息。这是不受欢迎的行为,现在我纠正了它。注意:这与这个问题本身无关,它只是导致我提出这个问题的原因。 该程序使用Spring+Hibernate来管理和访问数据和事务。 因为程序的

  • 问题内容: 现在基本设置都很好,我开始尝试事务。Struts + Spring + Hibernate注释事务管理器。这是Action中的示例代码,将调用服务类: 这是服务类中的方法: 首先,我调用了userDao,它将插入一个用户。其次,我在该服务类中调用了另一个方法。 由于PK为空,因此此操作将失败。我想第二个呼叫()将失败,但不会影响前一个。但是,未插入用户。 如果我仅致电: 它正在工作,这

  • 我们有一个Spring事务回滚问题,其中回滚似乎不起作用 在用注释的服务层方法中,我调用三个不同的类来插入3条记录 中间插入从第四个表执行get以填充描述字段,但此get失败。我希望第一次插入会回滚,但它似乎没有发生 几点: 获取方法抛出运行时异常 我们使用和中定义的。Bean是在中创建的,它被导入到 在层 中没有 注释 我们已经使用了

  • 问题内容: 当我从用户那里接收数据时,我每次都会验证输入的格式(PHP)。我唯一无法验证(或我不想)的是约束(例如外键)违规。我让DML引发并出错,并让数据库驱动程序引发异常。捕获它后,我只是通过MySQL的错误代码打印出一些错误消息。 问题是,即使插入失败,我仍然看到序列还在增长。我该如何预防呢? 问题答案: 这就是自动增量值和序列的工作方式。使用值时,如果事务失败,则不会回收该值,并且会回滚该