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

Spring超詳細講解事務和事務傳播機制

 更新時間:2022年06月20日 10:57:38   作者:亞太地區(qū)百大最帥面孔第101名  
Spring事務的本質就是對數(shù)據(jù)庫事務的支持,沒有數(shù)據(jù)庫事務,Spring是無法提供事務功能的。Spring只提供統(tǒng)一的事務管理接口,具體實現(xiàn)都是由數(shù)據(jù)庫自己實現(xiàn)的,Spring會在事務開始時,根據(jù)當前設置的隔離級別,調整數(shù)據(jù)庫的隔離級別,由此保持一致

為什么需要事務

事務是將一組操作封裝成一個執(zhí)行單元,要么全部成功,要么全部失敗。如果沒有事務,轉賬操作就會出現(xiàn)異常,因此需要保證原子性。

Spring 聲明事務

  • 只需要在方法上添加@Transactional注解就可以實現(xiàn),無需手動開啟和提交事務,如果中途發(fā)生異常就會自動回滾事務。
  • @Transactional既可以修飾方法也可以修飾類,修飾方法只能修飾public方法
  • 注意:@Transactional在異常被捕獲的情況下,事務就不會自動回滾
@Transactional(isolation = Isolation.READ_COMMITTED) // 開啟事務
    @RequestMapping("/insert")
    public int insert(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        return userService.add(userInfo);
    }
    @Transactional(isolation = Isolation.READ_COMMITTED) // 開啟事務
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影響的行數(shù):"+result);
        int num = 10/0;
        return result;
    }

Transactional參數(shù)說明

propagation

事務的傳播行為,默認為Propagation.REQUIRED

isolation

Spring有5種隔離級別,MySQL有四種隔離級別,Spring多了一個DEFAULT,以連接的數(shù)據(jù)庫的事務隔離級別為主

timeout

表示事務的超時時間,默認值為-1,如果事務執(zhí)行時間超過超時時間,就會自動回滾

事務回滾失效解決方案

直接拋出異常

    @Transactional(propagation = Propagation.REQUIRED) // 開啟事務
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影響的行數(shù):"+result);
        try {
            int num = 10/0;
        }catch (Exception e){
            result = 0;
            e.printStackTrace();
            throw e;//解決事務失效的問題
           // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return result;
    }

在catch中使用代碼手動進行事務的回滾操作

      @Transactional(propagation = Propagation.REQUIRED) // 開啟事務
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影響的行數(shù):"+result);
        try {
            int num = 10/0;
        }catch (Exception e){
            result = 0;
            e.printStackTrace();
            //throw e;//解決事務失效的問題
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return result;
    }

@Transactional工作原理

@Transactional是基于AOP實現(xiàn)的,AOP又是使用動態(tài)代理實現(xiàn)的。如果目標對象實現(xiàn)了接口,默認情況下會采用JDK的動態(tài)代理,如果目標對象沒有實現(xiàn)了接口,會使用CGLIB動態(tài)代理。

@Transactional在開始執(zhí)行業(yè)務之前,通過代理先開啟事務,在執(zhí)行成功之后再提交事務。如果中途遇到了異常,則回滾事務。

Spring 事務的傳播機制

定義:Spring中多個事務相互調用時,他們之間的行為方式是如何執(zhí)行的

為什么需要事務傳播機制?

事務的隔離級別是保證多個并發(fā)事務執(zhí)行的可控性(穩(wěn)定性),而事務傳播機制是保證一個事務在多個調用方法間的可控性

傳播機制的類型

嵌套事務和加入事務的區(qū)別

  • 整個事務如果全部執(zhí)行成功,二者的結果是一樣的
  • 如果事務執(zhí)行到一半失敗了,那么加入事務整個事務會全部回滾;而嵌套事務會局部回滾,不會影響上一個方法中執(zhí)行的結果

到此這篇關于Spring超詳細講解事務和事務傳播機制的文章就介紹到這了,更多相關Spring事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot Actuator監(jiān)控的項目實踐

    SpringBoot Actuator監(jiān)控的項目實踐

    本文主要結合 Spring Boot Actuator,跟大家一起分享微服務Spring Boot Actuator 的常見用法,方便我們在日常中對我們的微服務進行監(jiān)控治理,感興趣的可以了解一下
    2024-01-01
  • springboot整合redis進行數(shù)據(jù)操作(推薦)

    springboot整合redis進行數(shù)據(jù)操作(推薦)

    springboot整合redis比較簡單,并且使用redistemplate可以讓我們更加方便的對數(shù)據(jù)進行操作。下面通過本文給大家分享springboot整合redis進行數(shù)據(jù)操作的相關知識,感興趣的朋友一起看看吧
    2017-10-10
  • 淺析Java關鍵詞synchronized的使用

    淺析Java關鍵詞synchronized的使用

    Synchronized是java虛擬機為線程安全而引入的。這篇文章主要為大家介紹一下Java關鍵詞synchronized的使用與原理,需要的可以參考一下
    2022-12-12
  • 使用Java編寫串口程序的流程步驟

    使用Java編寫串口程序的流程步驟

    本文將介紹如何使用Java編寫串口程序,包括串口的基本概念、Java串口通信API的使用、串口程序的開發(fā)流程以及一些常見問題的解決方法等,希望通過本文的介紹,讀者能夠對使用Java編寫串口程序有一個基本的了解,并能夠實踐和應用于實際項目中
    2023-11-11
  • Mybatis源碼解析之mapper接口的代理模式詳解

    Mybatis源碼解析之mapper接口的代理模式詳解

    這篇文章主要介紹了Mybatis源碼解析之mapper接口的代理模式詳解,在mybatis中執(zhí)行sql時有兩種方式,一種是基于statementId,也就是直接調用SqlSession的方法,需要的朋友可以參考下
    2023-12-12
  • Java面試??贾瓹oncurrentHashMap多線程擴容機制詳解

    Java面試常考之ConcurrentHashMap多線程擴容機制詳解

    幾乎所有的后端技術面試官都要在?ConcurrentHashMap?技術的使用和原理方面對小伙伴們進行刁難,本文主要來和大家聊聊ConcurrentHashMap多線程的擴容機制,希望對大家有所幫助
    2023-05-05
  • Java+Swing實現(xiàn)五子棋游戲的示例代碼

    Java+Swing實現(xiàn)五子棋游戲的示例代碼

    本文將通過Java語言實現(xiàn)經(jīng)典游戲—五子棋游戲,文中采用了Swing制作游戲界面,具有開始游戲,悔棋,認輸,退出等功能。感興趣的可以跟隨小編一起動手試一試
    2022-02-02
  • spring(java,js,html) 截圖上傳圖片實例詳解

    spring(java,js,html) 截圖上傳圖片實例詳解

    這篇文章主要介紹了spring(java,js,html) 截圖上傳圖片實例詳解的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Java Scanner對象中hasNext()與next()方法的使用

    Java Scanner對象中hasNext()與next()方法的使用

    這篇文章主要介紹了Java Scanner對象中hasNext()與next()方法的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • mybatis-plus自定義排序的實現(xiàn)

    mybatis-plus自定義排序的實現(xiàn)

    本文主要介紹了mybatis-plus自定義排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01

最新評論

靖安县| 宜兴市| 平遥县| 三门峡市| 稻城县| 筠连县| 陇西县| 八宿县| 新丰县| 探索| 新乐市| 米林县| 青阳县| 博湖县| 霍山县| 外汇| 古丈县| 黔南| 成武县| 镇原县| 南郑县| 和林格尔县| 古丈县| 十堰市| 古交市| 巢湖市| 鹿泉市| 雷州市| 宜都市| 巴马| 界首市| 南京市| 鞍山市| 金华市| 陕西省| 井冈山市| 同仁县| 潼关县| 双城市| 游戏| 陆良县|