如何在 spring 启动时部分回滚数据,待解决的错误

How to partially rollback data in spring boot, errors to be persited

我在事务中有 table 数据创建序列,使用如下所示的 springbootjavajpahibernate 序列。使用的数据库是 Oracle

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

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

我想回滚 details_tablepayment_info 但不回滚 error_message,我希望它们被保留。

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

使用两个不同的事务。

默认事务传播是 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。确保您还了解异常如何影响交易。