欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于controller的異常處理及service層的事務(wù)控制方式

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

controller異常處理及service層的事務(wù)控制

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

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

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

dao層更多是單一的sql語句,沒有必要進(jìn)行事務(wù)控制,因?yàn)槭聞?wù)開銷并不便宜(官方原話);

基于以上三點(diǎn),回頭再思考關(guān)于異常的處理,一般情況應(yīng)該把異常網(wǎng)上拋,一直拋到最終處理的那一層,所以對(duì)于dao層和service其實(shí)是沒有必要進(jìn)行try-catch的,直接往上拋異常就可以。

與之對(duì)應(yīng)的,是spring的事務(wù)配置,默認(rèn)情況下,spring只對(duì)運(yùn)行時(shí)異常進(jìn)行回滾,如果在dao層處理了異常,那么需要進(jìn)行額外的配置,spring才會(huì)對(duì)異常進(jìn)行回滾,常用的配置是@Transactional(rollbackFor=Exception.class)

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

controller層Exception異常事務(wù)回滾失效問題

Spring的@Transactional源碼中寫道

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

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

測試①

默認(rèn)spring事務(wù)只在發(fā)生未被捕獲的 RuntimeException 時(shí)才回滾。

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

測試②

Exception異常,事務(wù)回滾失?。?/p>

// 測試回滾失敗案例,基于Exception實(shí)現(xiàn)回滾;
@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不進(jìn)行事務(wù)回滾

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();
}

測試④

手動(dòng)回滾解決Exception不進(jìn)行事務(wù)回滾

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();
        //手動(dòng)回滾,如果sql2()拋了異常,sql1()會(huì)回滾,不影響事物正常執(zhí)行
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
    return  R.ok();
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java設(shè)計(jì)模式系列之深入淺出單例模式

    Java設(shè)計(jì)模式系列之深入淺出單例模式

    設(shè)計(jì)模式是在大量的實(shí)踐中總結(jié)和理論之后優(yōu)選的代碼結(jié)構(gòu),編程風(fēng)格,以及解決問題的思考方式,下面這篇文章主要給大家介紹了關(guān)于Java設(shè)計(jì)模式系列之深入淺出單例模式的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Springboot整合FreeMarker的實(shí)現(xiàn)示例

    Springboot整合FreeMarker的實(shí)現(xiàn)示例

    本文主要介紹了Springboot整合FreeMarker的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java提示缺少返回語句的解決辦法

    Java提示缺少返回語句的解決辦法

    在本篇文章里小編給大家分享了關(guān)于Java提示缺少返回語句的解決辦法以及相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。
    2019-07-07
  • SpringBoot集成Validation參數(shù)校驗(yàn)

    SpringBoot集成Validation參數(shù)校驗(yàn)

    這篇文章主要為大家詳細(xì)介紹了SpringBoot集成Validation參數(shù)校驗(yàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring Boot CLI使用教程

    Spring Boot CLI使用教程

    本篇文章主要介紹了Spring Boot CLI使用教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 深入理解Java垃圾回收機(jī)制以及內(nèi)存泄漏

    深入理解Java垃圾回收機(jī)制以及內(nèi)存泄漏

    下面小編就為大家?guī)硪黄钊肜斫釰ava垃圾回收機(jī)制以及內(nèi)存泄漏。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給的大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • Java?Spring?Boot請(qǐng)求方式與請(qǐng)求映射過程分析

    Java?Spring?Boot請(qǐng)求方式與請(qǐng)求映射過程分析

    這篇文章主要介紹了Java?Spring?Boot請(qǐng)求方式與請(qǐng)求映射過程分析,Spring?Boot支持Rest風(fēng)格:使用HTTP請(qǐng)求方式的動(dòng)詞來表示對(duì)資源的操作
    2022-06-06
  • idea啟動(dòng)與jar包啟動(dòng)中使用resource資源文件路徑的問題

    idea啟動(dòng)與jar包啟動(dòng)中使用resource資源文件路徑的問題

    這篇文章主要介紹了idea啟動(dòng)與jar包啟動(dòng)中使用resource資源文件路徑的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 如何調(diào)用chatGPT實(shí)現(xiàn)代碼機(jī)器人

    如何調(diào)用chatGPT實(shí)現(xiàn)代碼機(jī)器人

    最近c(diǎn)hatGPT也是非常的火爆,相信大家都看到了,現(xiàn)在提供一種Java調(diào)用chatGPT的方法,我們主要通過兩個(gè)工具來實(shí)現(xiàn),一就是httpclient,二就是hutool,你覺得那種好理解你就用那種即可,今天通過本文給大家分享調(diào)用chatGPT實(shí)現(xiàn)代碼機(jī)器人,感興趣的朋友一起看看吧
    2022-12-12
  • java中mybatis和hibernate的用法總結(jié)

    java中mybatis和hibernate的用法總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于java中mybatis和hibernate的用法總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-01-01

最新評(píng)論