1. 程式人生 > >spring日誌回滾方法

spring日誌回滾方法

在使用spring中,配置了事務,並且在service方法上添加了@Transactional但是當程式出錯時並不能回滾,分析原因發現,預設spring事務只在發生未被捕獲的 runtimeexcetpion時才回滾。
spring aop 異常捕獲原理:被攔截的方法需顯式丟擲異常,並不能經任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,預設情況下aop只捕獲runtimeexception的異常,但可以通過配置來捕獲特定的異常並回滾,換句話說在service的方法中使用try catch 或者在catch中最後加上throw new runtimeexcetpion(),這樣程式異常時才能被aop捕獲進而回滾。
解決辦法:
方案1

.例如service層處理事務,那麼service中的方法中不做異常捕獲,或者在catch語句中最後增加throw new RuntimeException()語句,以便讓aop捕獲異常再去回滾,並且在controller層要繼續捕獲這個異常並處理

if(userSave){ 
     try { 
        userDao.save(user); 
        userCapabilityQuotaDao.save(capabilityQuota); 
       } catch (Exception e) { 
        logger.info("能力開通介面,開戶異常,異常資訊:"+e); 
        throw new RuntimeException(); 
     } 
}

方案2.在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常(現在專案的做法)

if(userSave){ 
    try { 
        userDao.save(user); 
        userCapabilityQuotaDao.save(capabilityQuota); 
    } catch (Exception e) { 
        logger.info("能力開通介面,開戶異常,異常資訊:"+e); 
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
    } 
 }

如果你剛好是程式設計師,如果你剛好又是Java程式設計師,如果剛好你的技術又遇到了瓶頸但是你又拒絕平庸,期待蛻變,想進入一線網際網路公司或者給自己漲薪
我這裡剛好有一套自己儲存的Java進階學習資料。包含了Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服務、Dubbo框架、Redis快取、RabbitMq訊息、JVM調優、Tomcat容器、MySQL資料庫
之前的兩千人群滿了 這個是新群Java高階進階群:963,,,944…895,免費傳送的喲