如何处理来自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 数组的批量删除?
如何处理来自 S3 的大文件并在 Spring Batch 中使用它