遇见1次线上bug,批量删除的时候,代码逻辑为循环删除,方法添加了事务。循环中某一次失败的时候,导致全部回滚,效果不太好,改为循环中失败的才回滚,已经成功的和未执行的不受影响。
参考了很多方法不奏效,后来查到使用回滚点,直接上代码:
//必须添加事务
@Transactional(rollbackFor = Exception.class)
public void delete() {
for (int i = 0; i < 100; i++) {
Object savePoint = null;
try{
//设置回滚点 *****重点1
savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
//处理业务逻辑
}catch (Exception e){
log.info("发生异常:{}",e.getMessage());
if (savePoint != null) {
//回滚 **** 重点2
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
}
}
}
}
如有不足之处或更好的方法请指教!