1.事務回滾機制在程序中運用的非常之多,我們常用的方式就是 註解的方式 也就是在我們的service層 加上一個@Transactional這樣既可
2.但是有些時候我們並不需要所有的事件都回滾 ,這樣就需要我們自己手動回滾事務了 再次說說手動事務回 TransactionAspectSupport
3.在項目中碰到這樣的需求 供大家參考
ResultMap resultMap1 = gradeDepartmentService.changeGradeDepsAndGrades1(memberToken, schoolUpdateReq);
if (!resultMap1.getCode().equals(ResultMap.success().getCode()))
{
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return resultMap1;
}
這裏既是手動回滾前面的操作。
4.原因補充
默認spring事務只在發生未被捕獲的 runtimeExcetpion時纔回滾。
spring aop 異常捕獲原理:被攔截的方法需顯式拋出異常,並不能經任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,默認情況下aop只捕獲runtimeException的異常,但可以通過 配置來捕獲特定的異常並回滾
5.
//代碼實現的方式
if(userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info("能力開通接口,開戶異常,異常信息:"+e);
throw new RuntimeException();
}
}
或者:
if(userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info("能力開通接口,開戶異常,異常信息:"+e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
另外一種方式回滾到切入點
使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 設置回滾點,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滾到savePoint。