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