如何处理来自catch块的spring jpa @transactional和新插入[重复]

Posted

技术标签:

【中文标题】如何处理来自catch块的spring jpa @transactional和新插入[重复]【英文标题】:How to handle spring jpa @transactional and new inserts from catch block [duplicate] 【发布时间】: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 的限制。 【参考方案1】:

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

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

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

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

【讨论】:

我将其作为单独的交易进行,但仍然无法正常工作。

以上是关于如何处理来自catch块的spring jpa @transactional和新插入[重复]的主要内容,如果未能解决你的问题,请参考以下文章

您如何处理 Spring Data JPA 中 ID 数组的批量删除?

如何处理和解析JPA持久性异常以向用户提供有意义的消息

突如其来的“中断异常”,我(Java)该如何处理?

如何处理来自 S3 的大文件并在 Spring Batch 中使用它

JPA 2.0 如何处理死锁(Eclipselink JPA2.0 MySQL)

如何处理不抛出 catch 的 API 请求? (403 错误)