【问题标题】:Transactional rollback for specific inserts特定插入的事务回滚
【发布时间】:2019-02-16 14:00:57
【问题描述】:

您好,我有一个要求,我正在读取一个文件打击是文件看起来如何的示例

文件.xls

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

0 acdss 12 6 14 ----- 没有例外

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

2 cxsas 52.2 24 21 ---- 没有例外

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

所以我的插入/更新在 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);

    }
}

使用这种方法,我的整个事务正在回滚,谁能建议我如何实现这一点。

【问题讨论】:

    标签: java spring spring-boot spring-mvc


    【解决方案1】:

    在服务调用周围放置一个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
           }
        }
    }
    

    TransactionException 是数据库事务上下文中Spring TxRuntimeException

    在您的示例中,默认的事务传播模式REQUIRED 就足够了。

    class service {
        @Transactional(readOnly = false)
        public void persistData(ob1,ob2,ob3) {
            //...
        }
    }
    

    【讨论】:

    • @Downvoter:请提供一些关于否决票的额外解释。这将帮助我改进我的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多