如何在 spring 启动时部分回滚数据,待解决的错误
How to partially rollback data in spring boot, errors to be persited
我在事务中有 table 数据创建序列,使用如下所示的 springboot
、java
、jpa
和 hibernate
序列。使用的数据库是 Oracle
- 下订单-插入订单details_table
- 处理付款 - 插入 payment_info table
- 错误消息(信息、警告、错误)- 插入 error_message table
如果发生任何错误(信息、警告、错误),我将在 error_message
table 中插入错误消息。
如果在处理请求期间没有发生错误,我的信息和警告消息将保存到 error_message
中。
但是,如果出现错误,我会从代码中抛出错误以回滚 transaction
,它可以正常工作,但我的 error_message
也会回滚。
我想回滚 details_table
和 payment_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。确保您还了解异常如何影响交易。
我在事务中有 table 数据创建序列,使用如下所示的 springboot
、java
、jpa
和 hibernate
序列。使用的数据库是 Oracle
- 下订单-插入订单details_table
- 处理付款 - 插入 payment_info table
- 错误消息(信息、警告、错误)- 插入 error_message table
如果发生任何错误(信息、警告、错误),我将在 error_message
table 中插入错误消息。
如果在处理请求期间没有发生错误,我的信息和警告消息将保存到 error_message
中。
但是,如果出现错误,我会从代码中抛出错误以回滚 transaction
,它可以正常工作,但我的 error_message
也会回滚。
我想回滚 details_table
和 payment_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。确保您还了解异常如何影响交易。