91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring中的事務回滾

發布時間:2020-06-15 14:07:52 來源:網絡 閱讀:631 作者:淺嫣 欄目:開發技術

Spring中的事務回滾

  

1.代碼中事務控制的3種方式

    • 編程式事務:就是直接在代碼里手動開啟事務,手動提交,手動回滾。優點就是可以靈活控制,缺點就是太麻煩了,太多重復的代碼了。

    • 聲明式事務:就是使用SpringAop配置事務,這種方式大大的簡化了編碼。需要注意的是切入點表達式一定要寫正確。

    • 注解事務:直接在Service層的方法上面加上@Transactional注解,個人比較喜歡用這種方式。

2.事務不回滾的原因

    在工作中,看過別人寫的代碼出現了事務不回滾的現象。當然,事務不回滾的都是采用的聲明式事務或者是注解事務;編程式事務都是自己寫代碼手動回滾的,因此是不會出現不回滾的現象。

 

    再說下聲明式事務和注解事務回滾的原理:當被切面切中或者是加了注解的方法中拋出了RuntimeException異常時,Spring會進行事務回滾。默認情況下是捕獲到方法的RuntimeException異常,也就是說拋出只要屬于運行時的異常(即RuntimeException及其子類)都能回滾;但當拋出一個不屬于運行時異常時,事務是不會回滾的。

 

    下面說說我經常見到的3種事務不回滾的產生原因:

    • (1)聲明式事務配置切入點表達式寫錯了,沒切中Service中的方法

    • (2)Service方法中,把異常給try catch了,但catch里面只是打印了異常信息,沒有手動拋出RuntimeException異常

    • (3)Service方法中,拋出的異常不屬于運行時異常(如IO異常),因為Spring默認情況下是捕獲到運行時異常就回滾

3.如何保證事務回滾

    正常情況下,按照正確的編碼是不會出現事務回滾失敗的。下面說幾點保證事務能回滾的方法

    • (1)如果采用編程式事務,一定要確保切入點表達式書寫正確

    • (2)如果Service層會拋出不屬于運行時異常也要能回滾,那么可以將Spring默認的回滾時的異常修改為Exception,這樣就可以保證碰到什么異常都可以回滾。具體的設置方式也說下:

                        ① 聲明式事務,在配置里面添加一個rollback-for,代碼如下

 <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

 1 <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> 

                        ② 注解事務,直接在注解上面指定,代碼如下

 

@Transactional(rollbackFor=Exception.class)
    • (3)只有非只讀事務才能回滾的,只讀事務是不會回滾的

    • (4)如果在Service層用了try catch,在catch里面再拋出一個 RuntimeException異常,這樣出了異常才會回滾

    • (5)如果你不喜歡(4)的方式,你還可以直接在catch后面寫一句回滾代碼(TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();來實現回滾,這樣的話,就可以在拋異常后也能return 返回值;比較適合需要拿到Service層的返回值的場景。具體的用法可以參見考下面的偽代碼

Spring中的事務回滾

/** TransactionAspectSupport手動回滾事務:*/
       @Transactional(rollbackFor = { Exception.class })  
       public boolean test() {  
            try {  
               doDbSomeThing();    
            } catch (Exception e) {  
                 e.printStackTrace();     
                 //就是這一句了, 加上之后拋了異常就能回滾(有這句代碼就不需要再手動拋出運行時異常了)                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  
                 return false;
            }  
           return true;
      }


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉荫县| 勃利县| 无为县| 尉氏县| 镇平县| 卢湾区| 祁阳县| 闽侯县| 瑞安市| 阿合奇县| 南康市| 那曲县| 无锡市| 天峨县| 广灵县| 四平市| 将乐县| 东阿县| 遂平县| 张家港市| 寿光市| 景泰县| 民和| 凌源市| 伊宁县| 清涧县| 上高县| 宣化县| 温宿县| 邵阳县| 新闻| 茌平县| 谢通门县| 东明县| 海南省| 九江县| 岢岚县| 萍乡市| 宜宾县| 肃宁县| 阳原县|