业务场景:
将一堆数据插入数据库的时候,可能会有报错,统计完全部的数据都有什么报错之后,要将已经插入的数据回滚,
并且在错误日志中记录全部数据中都有什么数据发生了错误
代码:
public void insertAndLog(){
List<JSONObject> errorLogInfoList=new ArrayList<>();
new TransactionTemplate().execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
//(1)生成保存点
Object savepoint = transactionStatus.createSavepoint();
//(2)todo 遍历数据,插入数据库,返回结果为错误日志,将错误日志放进集合errorLogInfoList中
//*********执行主要业务,过程中出现错误则回滚,并返回错误日志*************
//(3)异常个数大于0,则回滚,待记录完错误日志再抛出异常,否则(4)执行不到
if (errorLogInfoList.size() > 0) {
//回滚
transactionStatus.rollbackToSavepoint(savepoint);
return null;
}
return null;
}
});
//(4)todo 如果有错误日志,遍历错误日志集合errorLogInfoList,插入数据库,随后根据需要决定是否抛出异常
//*********将错误日志插入数据库*************
}
过程中遇到的问题:
之前以为把(4)的部分直接放在 transactionStatus.rollbackToSavepoint(savepoint); 后面就可以了,但是发现错误日志没有保存进去,也跟着回滚了
不太理解,回滚之后再保存的数据应该能保存进去的,难道是因为没有commit?但是没有找到对应的commit的方法