@事务回滚循环

Duy*_*ỳnh 1 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...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我将执行 insertTableA 和 insertTableB,当两者都完成时我的过程就成功了。我有第一次和第二次就成功了。但在第三次,insertTableB将抛出异常,我只想回滚这个循环,第一次和第二次已插入数据库。我怎样才能做到呢?请帮忙...

Mạn*_*yễn 6

将您的逻辑移至另一个服务并将其标记为@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...
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@Transactional
public class A{

    @Resource
    SubA subA;

    public void insertMultiTable(){
        for(Item item:items){
            subA.insert(item);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)