特定插入的事务性回滚

时间:2019-02-16 14:00:58

标签: 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个不同的表中

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

    }
}

使用这种方法,我的整个交易都会回滚,任何人都可以建议我如何实现这一目标。

1 个答案:

答案 0 :(得分:-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) {
        //...
    }
}