【问题标题】:How to handle spring jpa @transactional and new inserts from catch block [duplicate]如何处理来自catch块的spring jpa @transactional和新插入[重复]
【发布时间】:2016-05-23 15:43:25
【问题描述】:

我得到了这个代码。我正在使用 spring boot 和 jpa

@Transactional

public class MyClass {

    public void createSomething() {
        try {
            saveAndFlush();
        } catch (Exception e) {
            // Since error has occured I want to insert this information
            // into a audit table

            repository.saveAndFlush();

        }
    }

}

现在当异常发生时,事务被回滚,因此错误表插入不会发生。

我看到了

HHH000099:发生断言失败(这可能表明 Hibernate 中存在错误,但更可能是由于会话使用不安全):org.hibernate.AssertionFailure:XXXXXX 条目中的 ID 为空(之后不要刷新会话发生异常)

为了解决这个问题,我尝试在标有@Transactional(propagation = Propagation.REQUIRES_NEW) 的新方法中插入错误,因为了解内部事务将完成而外部事务将回滚

但我没有看到预期的输出。

【问题讨论】:

  • 正确。确实是重复的
  • @alan-hay - 即使按照原始线程中的说明进行操作,我仍然看到同样的问题。我在单个方法中将其设置为事务性并添加了一个需要新的传播
  • REQUIRES_NEW 仅在对另一个对象调用该方法时才有效。如果你在这个类中用REQUIRES_NEW 标记了一个方法并从这个类中调用它,它就不起作用。这是由于基于代理的 AOP 的限制。

标签: java spring hibernate jpa transactions


【解决方案1】:

从类级别删除@Transactional,并将其用于那些实际执行事务的方法。 (当然,如果您在该类中有超过 1 个方法)。

如果您希望独立事务提交/回滚到数据库,则在不会干扰全局事务的方法上使用 REQUIRES_NEW 传播。

'@Transactional' 没有提及任何传播的默认行为是,如果有任何可用的,则加入全局(调用)事务,如果没有则启动新事务。

因为你有一个全局事务,它被完全回滚。相反,您需要独立的事务。

【讨论】:

  • 我将其作为单独的交易进行,但仍然无法正常工作。
猜你喜欢
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
相关资源
最近更新 更多