Spring事務(wù)異常回滾,try catch 捕獲異常不回滾
例:一個方法報異常,另一個方法不會回滾
-
try {
-
userDao.save(user);
-
userCapabilityQuotaDao.save(capabilityQuota);
-
} catch (Exception e) {
-
}
例:一個方法報異常,另一個方法回滾
在catch語句中最后增加throw new RuntimeException()語句,以便讓aop捕獲異常再去回滾,并且在service上層(webservice客戶端,view層action)要繼續(xù)捕獲這個異常并處理
-
try {
-
userDao.save(user);
-
userCapabilityQuotaDao.save(capabilityQuota);
-
} catch (Exception e) {
-
throw new RuntimeException();
-
}
【現(xiàn)在的做法】在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常了
-
try {
-
userDao.save(user);
-
userCapabilityQuotaDao.save(capabilityQuota);
-
} catch (Exception e) {
-
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-
}
其實像第一種try catch這種把整個包裹起來,這種業(yè)務(wù)方法也就等于脫離了spring事務(wù)的管理,因為沒有任何異常會從業(yè)務(wù)方法中拋出,全被捕獲并“吞掉”,導(dǎo)致spring異常拋出觸發(fā)事務(wù)回滾策略失效。
如果在catch代碼塊中采用頁面硬編碼的方式使用spring api對事務(wù)做顯式的回滾,這樣寫也是可以的。
歡迎評論,一起學(xué)習(xí),對大家有用請點個贊。

浙公網(wǎng)安備 33010602011771號