1、需求:保存数据时,发生异常记录异常信息。
spring事务手动回滚时,会把方法体内所有的sql全部回滚,针对想要在方法体内保存异常信息的操作,会发现回滚后,想要执行的sql也会回滚。
解决方法:
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void saveUserInfo() {
//设置回滚点
Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
try {
// 保存用户信息操作
} catch (Exception e) {
// 发生异常后回滚代码
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
} finally {
// 发生异常信息后不回滚的代码逻辑
}
}
关键点:
//设置回滚点, 只回滚以下代码
TransactionAspectSupport.currentTransactionStatus().createSavepoint();
//手动回滚异常, 只回滚到savePoint
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);