鍍金池/ 問(wèn)答/Java/ 因?yàn)榭蚣苋毕輰?dǎo)致Spring事務(wù)回滾BUG

因?yàn)榭蚣苋毕輰?dǎo)致Spring事務(wù)回滾BUG

因?yàn)榭蚣苋毕?br>導(dǎo)致@Transactional(rollbackFor=Exception.class)無(wú)法執(zhí)行,
事務(wù)無(wú)法回滾該怎么辦?

clipboard.png

如圖,被我用try catch包起來(lái)了,執(zhí)行int s=1/0之后發(fā)生異常,不執(zhí)行deleteById,前面的數(shù)據(jù)刪掉了,后面的數(shù)據(jù)沒(méi)刪,也沒(méi)有回滾。

回答
編輯回答
憶當(dāng)年

在catch代碼塊使用下面這行代碼強(qiáng)制回滾即可

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
2017年7月21日 08:40
編輯回答
尐潴豬

最終把try catch 寫在UI層就可以了

2017年2月13日 08:36
編輯回答
乖乖瀦

這個(gè)不是框架缺陷也不是bug啊
@Transactional事務(wù)回滾是依賴AOP實(shí)現(xiàn)的,當(dāng)該方法有異常拋出才會(huì)回滾。
你在@Transactional(rollbackFor=Exception.class)方法里把異常給try catch了,那aop怎么攔截的到拋出的異常,你要在catch里面再重新把異常拋出才能回滾。

try {
  int i = 1 / 0;
  dao.deleteId(id);
} catch (Exception e) {
  e.printStackTrace();
  map.put("code", 1);
  map.put("msg", "刪除項(xiàng)目失敗");
  throw new Exception(e);
}

這樣就可以回滾了

2017年6月6日 16:59
編輯回答
青黛色
boolean success = false;
try {
    ... // db transaction
    success = true;
} finally {
    if (success) {
        // return successful results
    } else {
        // return failure
    }
}

試試這樣可以嗎

2017年3月13日 16:57