您好,我正在阅读一个文件打击的要求是该文件的外观示例
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);
}
}
使用这种方法,我的整个交易都会回滚,任何人都可以建议我如何实现这一目标。
答案 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 Tx的RuntimeException
。
在您的示例中,默认的事务传播模式REQUIRED
就足够了。
class service {
@Transactional(readOnly = false)
public void persistData(ob1,ob2,ob3) {
//...
}
}