Java 特定插入的事务回滚
您好,我有一个要求,其中我正在阅读一个文件打击的例子是如何文件看起来像 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进行数据库操作 下面是我实现的示例代码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循环中运行,并针对每一行运行 问题是,如果在将任何行的
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) {
//...
}
}