当前位置: 首页 > 知识库问答 >
问题:

在事务方法回滚中Hibernate事务方法调用

房新翰
2023-03-14

我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public void save(EntityToBeSaved entity) {
    try{
            for(SubEntity sub: entity.getSubEntities()) //specifics omitted
                  saveSubEntity(sub); //this is transactional
    }
    catch (DataIntegrityViolationException e){
        throw new BusinessException("Duplicate Name");
    }
}

saveSubEntity也有传播。REQUIREDandrollogackFor=Throwable.class,但是当事务在第二次调用时失败时,第一个subEntity被提交。

共有2个答案

路思源
2023-03-14

显然,该问题是由于错误的Spring注入而产生的,因为服务在启动时没有实例化,导致注释无法正常工作。谢谢你的帮助。

方承弼
2023-03-14

可能问题是Hibernate无法为save方法打开事务。

假设如果Hibernate没有为保存方法创建任何事务,那么由于其传播,每个saveSubEntity调用都将在不同的事务中。必需的。因此,每个saveSubEntity调用的更改都将提交给数据库。

要检查是否为save方法创建了事务,请帮助我删除saveSubEnitty方法上的事务注释。如果没有为save方法创建事务,您将看到一个错误。

 类似资料:
  • 问题内容: 事务成功或回滚后,我需要调用某些方法。我正在使用 该应用程序使用一些外部Web服务,这些内部Web服务在回滚内部事务时需要“清除”。有没有办法在不使用声明式事务管理的情况下完成此操作。 问题答案: 在Hibernate中,您可以扩展和覆盖 方法并将其注册在 或中。 在Spring中,您可以使用扩展,覆盖和注册 。 编辑 使用Spring Aop向所有带注释的方法添加同步的示例

  • 我有一个非事务性和异步方法,它调用同一服务的其他事务性方法。 如果发生了什么事情,我会捕获一个异常,如果发生了什么事情,我会保存错误,但回滚不起作用。

  • 我需要在事务成功或回滚后调用一些方法。我使用as 应用程序使用一些外部web服务,当内部事务回滚时,这些服务需要“清理”。有没有一种方法可以在不使用声明性事务管理的情况下实现这一点。

  • 我创建了一个MySQL数据库,并填充了用于测试的行。我想在这个数据库上进行DAO单元测试。每个都是,因此每次测试后都会进行回滚。不幸的是,它无法工作,因为我的数据库仍在进行更改。 我正在用以下上下文加载Spring配置。xml 这个问题说我 必须在应用程序上下文中提供bean 但即使有了它(在我的上下文中是),什么都没有发生,我的数据库仍然被修改,没有回滚。 这是我的DAO测试课 在我的配置中,或

  • 问题内容: 在Hibernate中,当我在事务中有一个对象,然后回滚它时,保存的对象仍保留在DB中。奇怪,因为使用or 方法不会发生此问题,而只会使用。 这是我正在使用的代码: 这是 HibernateUtil 类(只是涉及的函数,我保证该方法能正常工作- 有一个Interceptor处理程序,但现在不重要了): 谢谢 问题答案: 检查数据库是否支持回滚,即是否使用的是InnoDB表而不是MyIS