@Transactional回滚循环

时间:2018-06-12 15:51:16

标签: java spring loops spring-transactions

使用@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将抛出异常,我只想要回滚只有这个循环第一次和第二次插入数据库。我怎么能这样做?请帮忙......

1 个答案:

答案 0 :(得分:0)

将您的逻辑移至其他服务并使用@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);
        }
    }
}