[英]Transactional rollback for specific inserts
嗨,有一個要求,我正在讀取一個文件,這是文件外觀的示例
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和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);
}
}
使用這種方法,我的整個交易都會回滾,有人可以建議我如何實現這一目標。
try
/ catch
服務調用,以便即使在發生事務錯誤的情況下也可以繼續在persistData
中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) {
//...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.