在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.class
和propagation = Propagation.REQUIRES_NEW
,这样可以保证这个操作不会被事务回滚。
在doTransaction
方法中,我们执行交易操作,并在抛出异常时记录交易失败的信息。在记录信息时,我们创建了一个新的Transaction
对象,并将交易的相关信息设置到该对象中,然后调用recordFailedTransaction
方法来进行记录。
通过这种方式,我们可以在保证事务回滚的同时,记录交易失败的信息,从而实现数据的一致性和记录的需求。
版权声明:除特殊说明,文章均为博主 去吐槽 原创文章,转载请注明原文出处。