【问题标题】:How to partially rollback data in spring boot, errors to be persited如何在 Spring Boot 中部分回滚数据,要持久化的错误
【发布时间】:2021-01-24 03:58:01
【问题描述】:

我在事务中有创建表数据的序列,使用如下所示的springboot、java、jpa 和hibernate 序列。使用的数据库是Oracle

  1. 下订单 - 插入订单 details_table
  2. 处理付款 - 插入到 payment_info 表中
  3. 错误消息(信息、警告、错误) - 插入到 error_message 表中

如果发生任何错误(信息、警告、错误),我将在 error_message 表中插入错误消息。
如果在处理请求期间没有发生错误,我的信息和警告消息将保留到 error_message。 但是如果出现错误,我会从代码中抛出一个错误以回滚 transaction,它可以工作,但我的 error_message 也会回滚。

我想回滚 details_table 和 payment_info 但不是 error_message,我希望它们被持久化。

我怎样才能达到同样的效果?

【问题讨论】:

标签: java oracle spring-boot spring-data-jpa spring-transactions


【解决方案1】:

使用两个不同的事务。

默认事务传播是REQUIRED,当在没有事务上下文的情况下调用@Transactional 注释方法时,将启动一个新事务,但如果已经有一个事务,则该事务将被加入,以一个结束单笔交易。在回滚的情况下,所有操作都将被回滚,因为它们属于同一个事务。

将事务传播更改为REQUIRES_NEW,以便始终强制启动一个新事务(而不是加入它,如果有的话)。这将允许您独立于付款信息提交错误消息交易。

@Transactional
public void placeOrder(Order oder) {
  // process order
  
  paymentGateway.processPayment();

  // save order <- an exception here will rollback the current 
  // transaction but not the one in PaymentGateway which is independent
} 

// In PaymentGateway
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void processPayment() {
  // process payment
  // insert error messages
}

进一步阅读:Understanding PROPAGATION_REQUIRED。确保您还了解异常如何影响事务。

【讨论】:

  • 在上述情况下,如果没有错误,我的订单数据也会被回滚
  • 默认情况下事务会提交,请确保您了解异常如何触发回滚
猜你喜欢
  • 2020-01-19
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2019-02-19
  • 2021-12-26
  • 2018-04-27
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多