最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關于controller的異常處理及service層的事務控制方式

 更新時間:2022年02月26日 11:33:45   作者:yuan487639  
這篇文章主要介紹了關于controller的異常處理及service層的事務控制方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

controller異常處理及service層的事務控制

最近寫代碼涉及到一些事務,上午終于把代碼給理順了,之前不太清楚在哪里做異常處理,導致代碼遍地try-catch,相當難看。

還是基于controller-service-dao三層來寫代碼,從入口開始,controller層的方法對應的是某個url,面向的是應用人員,應該返回他們能讀懂的信息,所以controller必須做異常處理,一般來說會有統(tǒng)一的異常處理方法;

service層面向的是controller,service層中的某些方法,必須保證其事務,所以在service層進行事務控制是相當必要的,對于多條sql進行事務控制,如果某個sql執(zhí)行失敗,那么應當對已經執(zhí)行的sql語句進行回滾;

dao層更多是單一的sql語句,沒有必要進行事務控制,因為事務開銷并不便宜(官方原話);

基于以上三點,回頭再思考關于異常的處理,一般情況應該把異常網上拋,一直拋到最終處理的那一層,所以對于dao層和service其實是沒有必要進行try-catch的,直接往上拋異常就可以。

與之對應的,是spring的事務配置,默認情況下,spring只對運行時異常進行回滾,如果在dao層處理了異常,那么需要進行額外的配置,spring才會對異常進行回滾,常用的配置是@Transactional(rollbackFor=Exception.class)

順便提一個java知識點,關于try-catch-finally中,finally的作用,finally設計之初就是為了關閉資源,如果在finally中使用return語句,會覆蓋try或者catch的返回值,最常見的就是覆蓋異常,即便catch往上拋了異常,也會被覆蓋,返回finally中return語句的返回值。 

controller層Exception異常事務回滾失效問題

Spring的@Transactional源碼中寫道

By default, a transaction will be rolling back on {@link RuntimeException}and {@link Error} but not on checked exceptions (business exceptions).

默認情況下,如果在事務中拋出了未檢查異常(繼承自 RuntimeException 的異常)或者 Error,則 Spring 將回滾事務;除此之外,Spring 不會回滾事務。

測試①

默認spring事務只在發(fā)生未被捕獲的 RuntimeException 時才回滾。

// 測試回滾成功案例,基于IllegalArgumentException(RuntimeException)實現回滾
@GetMapping("/testSuccess")
@Transactional// 如果不加,就不會回滾
public R testSuccess(@RequestParam("type") Integer type){
    eduTeacherService.removeById("2");
    if (type == 1){
        throw new IllegalArgumentException("測試回滾成功案例!");
    }
    eduTeacherService.removeById("3");
    return  R.ok();
}

測試②

Exception異常,事務回滾失??;

// 測試回滾失敗案例,基于Exception實現回滾;
@GetMapping("/testFail")
@Transactional
public R testFail(@RequestParam("type") Integer type)  {
    try {
        eduTeacherService.removeById("2");
        if (type == 1){
            throw new Exception("測試回滾失敗案例!");
        }
        eduTeacherService.removeById("3");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return  R.ok();
}

測試③

用rollbackFor解決Exception不進行事務回滾

rollbackFor = Exception.class + throws Exception
@GetMapping("/testFailRollbackFor")
// 配置rollbackFor
@Transactional(propagation= Propagation.REQUIRED,rollbackFor = Exception.class)
public R testFailRollbackFor(@RequestParam("type") Integer type) throws Exception {
        eduTeacherService.removeById("2");
        if (type == 1){
            throw new Exception("測試回滾失敗rollbackFor成功案例!");
        }
        eduTeacherService.removeById("3");
    return  R.ok();
}

測試④

手動回滾解決Exception不進行事務回滾

catch:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@GetMapping("/testSuccessByHand")
@Transactional
public R testSuccessByHand(@RequestParam("type") Integer type)  {
    try {
        eduTeacherService.removeById("2");
        if (type == 1){
            throw new Exception("測試回滾失敗案例!");
        }
        eduTeacherService.removeById("3");
    } catch (Exception e) {
        e.printStackTrace();
        //手動回滾,如果sql2()拋了異常,sql1()會回滾,不影響事物正常執(zhí)行
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
    return  R.ok();
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java門禁系統(tǒng)面向對象程序設計

    java門禁系統(tǒng)面向對象程序設計

    這篇文章主要為大家詳細介紹了java門禁系統(tǒng)面向對象程序設計,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java死鎖產生原因及示例

    Java死鎖產生原因及示例

    本文主要介紹了Java死鎖產生原因及示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java?Stream流使用最多的方式示例詳解

    Java?Stream流使用最多的方式示例詳解

    在 Java 編程中,Stream 流提供了一種高效、便捷的方式來處理集合數據,本文將詳細介紹 Java 中 Stream 流的用法,包括基礎用法、中級用法、高級用法以及一些特殊方法的使用,感興趣的朋友一起看看吧
    2024-12-12
  • Java日常練習題,每天進步一點點(4)

    Java日常練習題,每天進步一點點(4)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • SpringBoot4.5.2 整合HikariCP 數據庫連接池操作

    SpringBoot4.5.2 整合HikariCP 數據庫連接池操作

    這篇文章主要介紹了SpringBoot4.5.2 整合HikariCP 數據庫連接池操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 在Java中將double轉換為int的操作方法

    在Java中將double轉換為int的操作方法

    這篇文章主要介紹了在Java中將double轉換為int的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • maven的pom文件與打包詳解

    maven的pom文件與打包詳解

    pom文件定于了一個maven項目的maven配置,一般pom文件的放在項目或者模塊的根目錄下。本文詳細的介紹了pom文件配置,感興趣的可以了解一下
    2021-08-08
  • java設置session過期時間的實現方法

    java設置session過期時間的實現方法

    這篇文章主要介紹了java設置session過期時間的實現方法,以實例形式詳細講述了具體實現過程,非常具有參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • 海量數據去重排序bitmap(位圖法)在java中實現的兩種方法

    海量數據去重排序bitmap(位圖法)在java中實現的兩種方法

    今天小編就為大家分享一篇關于海量數據去重排序bitmap(位圖法)在java中實現的兩種方法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 關于LocalDateTime使用詳解

    關于LocalDateTime使用詳解

    這篇文章主要介紹了關于LocalDateTime使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論

墨玉县| 高台县| 昆明市| 合肥市| 淄博市| 始兴县| 聂拉木县| 河南省| 南雄市| 合阳县| 鄂托克旗| 樟树市| 海口市| 九寨沟县| 巍山| 临夏县| 福建省| 浦城县| 响水县| 抚远县| 科尔| 平凉市| 宁都县| 涟水县| 曲麻莱县| 临城县| 离岛区| 永宁县| 景洪市| 项城市| 迁西县| 新干县| 开远市| 苏尼特右旗| 和平区| 三门县| 当雄县| 井陉县| 灵石县| 江阴市| 隆回县|