java - @事务回滚循环

标签 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将抛出异常,我只想回滚这个循环,第一次和第二次已插入数据库。我怎样才能做到呢?请帮忙...

最佳答案

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

关于java - @事务回滚循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50821235/

相关文章:

java - Spring覆盖另一个模块的bean

javascript - JavaScript 的循环问题,将值插入数组不起作用

Python 斐波那契数列 - 不同的 while 循环

java - 余弦相似度返回错误的距离

java - Raspberry PI、Java 和 Pi4J 控制 GPIO 无法获取当前 PinState

java - 如何从表单获取文件的数据?

spring - 在Grails 3中使用Spring Boot Spring Security配置

java - 从另一个 Servlet Post 方法调用 Servlet Get 方法?

java - Jackson 数据绑定(bind) JSON boolean 转换

Java - 在解析文本文件时在某些条件下打破循环