SpringBoot报错事务回滚但要写失败记录表时如何单独提交事务?

在SpringBoot中,当程序执行报错时,事务会自动回滚,这是为了保证数据的一致性。但是,在某些情况下,我们需要在事务回滚的同时,保留某些数据的变更,比如交易失败以后要写一笔交易失败的记录到交易流水表里,那要怎么样才能控制这笔失败交易的记录在写到交易流水表里的时候不会被一起回滚呢?

为了解决这个问题,我们可以使用try-catch语句来捕获异常,并在catch语句块中进行记录交易失败的操作。同时,我们需要使用新的事务来保证这个操作不会被回滚。

下面是一个示例代码:

@Service
@Transactional
public class TransactionService {

    @Autowired
    private TransactionDao transactionDao;

    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void recordFailedTransaction(Transaction transaction) {
        try {
            // 在此处执行交易失败的记录操作
            transactionDao.insertTransaction(transaction);
        } catch (Exception e) {
            // 记录日志或者进行其他处理
            e.printStackTrace();
        }
    }

    public void doTransaction(Transaction transaction) {
        // 在此处执行交易操作
        try {
            // 事务开始
            // ...
            // 抛出异常,事务回滚
            throw new Exception("Transaction failed");
            // ...
            // 事务提交
        } catch (Exception e) {
            // 事务回滚,并记录交易失败的信息
            Transaction failedTransaction = new Transaction();
            failedTransaction.setAmount(transaction.getAmount());
            failedTransaction.setSourceAccount(transaction.getSourceAccount());
            failedTransaction.setTargetAccount(transaction.getTargetAccount());
            recordFailedTransaction(failedTransaction);
            throw e;
        }
    }
}

在上面的代码中,我们定义了一个recordFailedTransaction方法来记录交易失败的信息,该方法使用了新的事务,并且设置了rollbackFor = Exception.classpropagation = Propagation.REQUIRES_NEW,这样可以保证这个操作不会被事务回滚。

doTransaction方法中,我们执行交易操作,并在抛出异常时记录交易失败的信息。在记录信息时,我们创建了一个新的Transaction对象,并将交易的相关信息设置到该对象中,然后调用recordFailedTransaction方法来进行记录。

通过这种方式,我们可以在保证事务回滚的同时,记录交易失败的信息,从而实现数据的一致性和记录的需求。

相关文章 推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注