for循环下的事务提交

112 阅读1分钟

1.第一种写法:

手动设置回滚点

@Transactional(rollbackFor = Exception.class)
public void check() {

    for (Item item : List) {
        //设置回滚点
        Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();

        try {

            //核对
            check(item)
            //保存核对信息
            saveCheckInfo(item);

        } catch (Exception e) {
            //回滚当前事务
        TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);

        }
    }
}

2.第二种写法

这个注解很重要,意思是设置当前方法的事务传播级别为REQUIRES_NEW,表示当前方法内的所有事务都是独立的,不影响整体的事务。 有的项目使用注解的方式配置当前方法传播属性会无效,此时可能需要你去你的spring-mybatis.xml文件中配置,效果是一样的。

@Transactional(propagation = Propagation.REQUIRES_NEW)//关注点一!!!
public void closeOrder() {

    try{
        //这里,执行你自己的业务,比如商品库存回退,订单状态改变,操作流水等。
        //重点关注的是@Transactional注解和TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
        
    }catch (Exception e){
        //这一段表示手动回滚事务,此处的try-catch,是表示当前方法如果出错了,
        //那我就自己消化这个异常,不再往外抛,处理异常的方式是手动回滚事务。
        //如此,每个循环体都自己处理自己的事务,不管成功与失败,都不影响整个循环
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//关注点二!!!
    }
}

原文链接:blog.csdn.net/zhangjiamin…