前言:同事在循环订单生效时,某个订单执行生效时报错,其他数据正常生效,报错的呢个订单没有进行事务回滚。订单生效的方法是原来的,他只用调用即可。
他的错误代码:
for ( String orderNumber : orderList) {
try{
//原订单生效方法
orderManager.active(orderNumber);
} catch (Exception e) {
//这里捕获了异常导致事务没有回滚
logger.error(e)
}
}
原生效方法的事务注解代码
@Transactional
public void active(String orderNumber){
//代码逻辑 ,在这里报错了
}
若要实现事务只回滚某个生效失败的单子需要将 @Transactional 注解
修改成 :@Transactional ( propagation = Propagation.REQUIRES_NEW)
原因:
默认@Transactional 是指,上层调用如果有事务就加入事务,没有事务就创建事务执行。
修改成@Transactional ( propagation = Propagation.REQUIRES_NEW) 是指,上层若存在事务,则将上层事务进行挂起,自己新建一个事务进行执行,新建的事务中如果抛错不会影响其他循环执行的操作,自己的方法会进行回滚。