首页 > 解决方案 > @Transactional 循环回滚

问题描述

使用@Transactional 时回滚事务有一些问题。我有以下代码:

@Transactional
public class A{

    @Resource
    Object obj;

    public void insertMultiTable(){
        for(Item item:items){
            try{
                obj.insertTableA();
                obj.insertTableB();
            } catch(Exception e){
                // do somethings...
            }
        }
    }
}

如您所见,我将执行 insertTableA 和 insertTableB,当两者都完成时,我的过程是成功的。我第一次和第二次都是成功的。但第三,insertTableB 会抛出异常,我只想回滚这个循环,第一次和第二次已经插入数据库。我该怎么做?请帮忙...

标签: javaspringloopsspring-transactions

解决方案


将您的逻辑移动到另一个服务并用@Transactional(propagation = Propagation.REQUIRES_NEW)

它将使每个循环事务都是独立的。(IE:第三个循环抛出异常只会回滚第三个循环,让第一个和第二个循环结果提交)

public class SubA {
    @Resource
    Object obj;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insert(Item i) {
           try{
                obj.insertTableA();
                obj.insertTableB();
            } catch(Exception e){
                // do somethings...
            }
    }
}

A现在在您的班级中调用此服务

@Transactional
public class A{

    @Resource
    SubA subA;

    public void insertMultiTable(){
        for(Item item:items){
            subA.insert(item);
        }
    }
}

推荐阅读