亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解決try-catch捕獲異常信息后Spring事務(wù)失效的問題

 更新時間:2021年06月21日 15:19:35   作者:DT辰白  
這篇文章主要介紹了解決try-catch捕獲異常信息后Spring事務(wù)失效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、首先在Spring Boot項目中,手動添加異常方法進行測試

@Transactional(rollbackFor=Exception.class) //表示此方法有異常時觸發(fā)Spring事務(wù)
@Override
public CommonResult<User> saveUser(User user) {
    int insert = baseMapper.insert(user);
    try {
        // 添加異常,并進行捕獲
        int a = 10/0;
    }catch (Exception e){
        logger.info("打印異常信息:"+e);
        return CommonResult.commentFailure("服務(wù)器異常,事務(wù)回滾");
    }
    if(insert > 0){
        return CommonResult.commentSuccess(user);
    }else {
        return CommonResult.commentFailure("添加失敗");
    }
}

1、一個添加信息的實現(xiàn)類方法上,此處我們加了Spring的事務(wù)。

2、問題:一個方法報異常(int a = 10/0)進行了異常捕獲,另一個方法不會回滾(insert添加方法)

這是什么情況呢,相當(dāng)于Spring事務(wù)策略失效了。

try-catch捕獲了異常后,這種業(yè)務(wù)方法也就等于脫離了spring事務(wù)的管理,因為沒有任何異常會從業(yè)務(wù)方法中拋出,全被捕獲并“吞掉”,導(dǎo)致spring異常拋出觸發(fā)事務(wù)回滾策略失效。

通俗的來說:默認(rèn)spring事務(wù)只在發(fā)生未被捕獲的 runtimeexcetpion或error時才回滾。

二、處理方案一

spring aop 異常捕獲進而回滾。在catch中最后加上throw new runtimeexcetpion(),這樣程序異常時才能被aop捕獲進而回滾,缺點是無法return異常信息提示,前端用戶交互效果不佳

@Transactional(rollbackFor=Exception.class)  //表示此方法有異常時觸發(fā)Spring事務(wù)
@Override
public CommonResult<User> saveUser(User user) {
    int insert = baseMapper.insert(user);
    try {
        // 添加異常,并進行捕獲
        int a = 10/0;
    }catch (Exception e){
        logger.info("異常信息:"+e);
        // 方案一:spring aop 異常捕獲
        throw new RuntimeException();
    }
    if(insert > 0){
        return CommonResult.commentSuccess(user);
    }else {
        return CommonResult.commentFailure("添加失敗");
    }
}

三、處理方案二

就是讓一個方法報異常,另一個方法回滾,這樣才能真正的觸發(fā)Spring事務(wù)回滾策略。

catch語句中增加:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手動回滾,這樣上層就無需去處理異常了

完整代碼:

@Transactional(rollbackFor=Exception.class) //表示此方法有異常時觸發(fā)Spring事務(wù)
@Override
 public CommonResult<User> saveUser(User user) {
     int insert = baseMapper.insert(user);
     try {
         // 添加異常,并進行捕獲
         int a = 10/0;
     }catch (Exception e){
         logger.info("異常信息:"+e);
         // 方案二:手動回滾
         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
         return CommonResult.commentFailure("服務(wù)器異常,事務(wù)回滾");
     }
     if(insert > 0){
         return CommonResult.commentSuccess(user);
     }else {
         return CommonResult.commentFailure("添加失敗");
     }
 }

四、如過需要手動進行手動回滾的業(yè)務(wù)方法比較多,我們可以寫一個公共的工具類

SpringRollBackUtil.java

public class SpringRollBackUtil {
    /**
     * 事務(wù)回滾機制
     */
    public static void rollBack() {
        try {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

只需調(diào)用方法即可

// 方案三:公共工具類 手動回滾
SpringRollBackUtil.rollBack();

Spring mvc:事務(wù)引起的try/catch失效

在測試一個接口時,發(fā)現(xiàn)一個奇怪的現(xiàn)象:

該接口使用@ResponseBody注解返回json格式數(shù)據(jù),并且使用try/catch包括全部邏輯代碼,debug后發(fā)現(xiàn)返回數(shù)據(jù)沒有任何錯誤,只包含一段因產(chǎn)生異常導(dǎo)致的錯誤提示字符串,但是chrome瀏覽器network卻顯示http狀態(tài)碼為500。

最后發(fā)現(xiàn)在該RequestMapping方法上還有一個注解@Transactional,去除ok。

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

相關(guān)文章

  • 淺談Java編程中的內(nèi)存泄露情況

    淺談Java編程中的內(nèi)存泄露情況

    這篇文章主要介紹了Java編程中的內(nèi)存泄露情況,牽扯到JVM的垃圾回收相關(guān)知識,需要的朋友可以參考下
    2015-10-10
  • 微信小程序完整項目實戰(zhàn)記錄(前端+SpringBoot后端)

    微信小程序完整項目實戰(zhàn)記錄(前端+SpringBoot后端)

    隨著微信小程序的流行,越來越多的開發(fā)者開始涉足小程序開發(fā),下面這篇文章主要給大家介紹了關(guān)于微信小程序完整項目實戰(zhàn)的相關(guān)資料,項目包括前端+SpringBoot后端,需要的朋友可以參考下
    2024-09-09
  • Java list.remove( )方法注意事項

    Java list.remove( )方法注意事項

    這篇文章主要介紹了Java list.remove( )方法注意事項,非常簡單易懂,需要的朋友可以參考下
    2018-08-08
  • spring Profile如何為不同環(huán)境提供不同的配置支持

    spring Profile如何為不同環(huán)境提供不同的配置支持

    這篇文章主要介紹了spring Profile如何為不同環(huán)境提供不同的配置支持,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Java后臺如何處理日期參數(shù)格式

    Java后臺如何處理日期參數(shù)格式

    這篇文章主要介紹了Java后臺如何處理日期參數(shù)格式問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Springboot全局異常捕獲及try catch區(qū)別解析

    Springboot全局異常捕獲及try catch區(qū)別解析

    這篇文章主要介紹了Springboot全局異常捕獲及try catch區(qū)別解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • IDEA部署JavaWeb項目到Tomcat服務(wù)器的方法

    IDEA部署JavaWeb項目到Tomcat服務(wù)器的方法

    這篇文章主要介紹了IDEA部署JavaWeb項目到Tomcat服務(wù)器的方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-06-06
  • BeanFactory與ApplicationContext的區(qū)別示例解析

    BeanFactory與ApplicationContext的區(qū)別示例解析

    這篇文章主要為大家介紹了BeanFactory與ApplicationContext的區(qū)別示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 使用maven對springboot項目進行瘦身分離jar的多種處理方案

    使用maven對springboot項目進行瘦身分離jar的多種處理方案

    springboot項目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個插件默認(rèn)情況下,會把所有的依賴包全部壓縮到一個jar里面,今天給大家分享幾種方案來如何減小我們的打包文件,需要的朋友可以參考下
    2024-02-02
  • mybatis-plus與mybatis共存的實現(xiàn)

    mybatis-plus與mybatis共存的實現(xiàn)

    本文主要介紹了mybatis-plus與mybatis共存的實現(xiàn),文中根據(jù)實例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論