Java 特定插入的事务回滚

Java 特定插入的事务回滚,java,spring,spring-boot,spring-mvc,Java,Spring,Spring Boot,Spring Mvc,您好,我有一个要求,其中我正在阅读一个文件打击的例子是如何文件看起来像 File.xls id scode value1 value2 value3-----依此类推 0 acdss 12 6 14------无例外 1 acxx 0.14 5 12-----异常--回滚 2 cxsas 52.2 24 21----无例外 对于每一行,在执行一些业务逻辑之后,我必须将数据插入/更新到3个不同的表中 因此,我的insert/update在for循环中运行,并针对每一行运行 问题是,如果在将任何行的

您好,我有一个要求,其中我正在阅读一个文件打击的例子是如何文件看起来像

File.xls

id scode value1 value2 value3-----依此类推

0 acdss 12 6 14------无例外

1 acxx 0.14 5 12-----异常--回滚

2 cxsas 52.2 24 21----无例外

对于每一行,在执行一些业务逻辑之后,我必须将数据插入/更新到3个不同的表中

因此,我的insert/update在for循环中运行,并针对每一行运行

问题是,如果在将任何行的数据插入/更新到数据库中时发生任何异常,我希望从该特定行的所有3个表中回滚插入,并继续插入该行的其余部分 正如在id 0和2的文件示例中提到的,没有例外,数据应该插入到所有3表中,对于id 1,它应该回滚所有插入。 我正在使用jdbcTemplate进行数据库操作 下面是我实现的示例代码

    class writer {
    public void persistData() {
        // code to read file and created object for each table
        // size of file here is 3 so loop is running 3 times and table1Object
        // and table2Object and table3Object has rows to be inserted into
        // database table A,B,C
        for (int i = 0; i < 3; i++) {
            service.persistData(table1Object[i], table2Object[i], table3Oject[i]);

        }
    }
}

class service {
    @Transactional(propagation = Propagation.REQUIRED_NEW, readOnly = false)
    public void persistData(ob1,ob2,ob3){
        dao.insertionOrUpadteForTableA(ob1);
        dao.insertionOrUpadteForTableB(ob2);
        dao.insertionOrUpadteForTableC(ob3);

    }
}
类编写器{
公共数据(){
//用于读取文件并为每个表创建对象的代码
//这里的文件大小是3,所以循环运行了3次,table1Object
//table2Object和table3Object都有要插入的行
//数据库表A、B、C
对于(int i=0;i<3;i++){
服务持久化数据(表1对象[i]、表2对象[i]、表3项目[i]);
}
}
}
班级服务{
@事务性(传播=传播.REQUIRED\u NEW,readOnly=false)
公共数据(ob1、ob2、ob3){
dao.Insertionorupadefortablea(ob1);
dao.插入rupadtefortableb(ob2);
dao.插入Rupadtefortablec(ob3);
}
}

使用这种方法,我的整个事务都在回滚。任何人都可以建议我如何实现这一点。

在服务调用周围放置一个
try
/
catch
,以便在
persistData
中继续逐行处理文件,即使出现事务错误:

public void persistData() {
    for (int i = 0; i < 3; i++) {
       try {
           service.persistData(table1Object[i], table2Object[i], table3Oject[i]);
       } catch (TransactionException ex) {
           // handle exception
       }
    }
}

@向下投票人:请提供一些关于向下投票的额外解释。这将帮助我改进我的答案。谢谢
class service {
    @Transactional(readOnly = false)
    public void persistData(ob1,ob2,ob3) {
        //...
    }
}