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

溫馨提示×

溫馨提示×

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

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

spring的事務傳播機制詳細介紹

發布時間:2021-09-07 13:40:24 來源:億速云 閱讀:133 作者:chen 欄目:開發技術

本篇內容主要講解“spring的事務傳播機制詳細介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“spring的事務傳播機制詳細介紹”吧!

目錄
  • spring的事務傳播機制

    • 1、why

      • 為什么會有事務傳播機制?

    • 2、傳播機制生效的條件

      • 解決方案

    • 3、傳播機制類型

      • PROPAGATION_REQUIRED (默認)

      • REQUIRES_NEW (一般用在子方法需要單獨事務)

      • NESTED

      • SUPPORTS

      • NOT_SUPPORTED

      • MANDATORY

      • NEVER

spring的事務傳播機制

背景:實習期間幾次遇到事務方法,有一次本地測試時發現事務沒有回滾,就把簡單描述寫在wx上,今天來給spring事務做個自我總結。

1、why

為什么會有事務傳播機制?

場景一:

  • serviceA 方法調用了 serviceB 方法,但兩個方法都有事務,這個時候如果 serviceB 方法異常,是讓 serviceB 方法提交,還是兩個一起回滾。

場景二:

  • serviceA 方法調用了 serviceB 方法,但是只有 serviceA 方法加了事務,是否把 serviceB 也加入 serviceA 的事務,如果 serviceB 異常,是否回滾 serviceA 。

場景三:

  • serviceA 方法調用了 serviceB 方法,兩者都有事務,serviceB 已經正常執行完,但 serviceA 異常,是否需要回滾 serviceB 的數據。

所以,我們需要有對應的事務傳播機制來控制事務。

2、傳播機制生效的條件

有了spring事務傳播機制,那這種機制存在的條件呢?我們知道,spring的事務是基于aop的,確切來說,是基于JDK動態代理的AOP,這種AOP有什么特點呢? 它是基于類或者接口的,也就是說,當 @Transactional寫在一個方法上時,這個方法將會被spring動態代理, 生成一個動態代理類, 對原方法進行修飾增強,但是要注意!! 原先的方法的類并沒有什么不同,并沒有事務,spring動態代理這個類生成的代理類才有事務,才有增強,也就是說,在同一個類里面通過this.xx()調用本類的事務方法時,事務是不會生效的,因為你調用的不是代理類。

@Transactional
    @Override
    public void method1() {
        this.method2(); 
    } 
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void method2() {
       xx
    }
解決方案

關鍵在于獲取類的代理對象,而不是通過this去調用,所以以下方法都是基于這個關鍵點去解決的。

  • 1、最簡單的,兩個事務方法放在不同的service里面,這個比較簡單,就不給例子了。(推薦)

  • 2、AOP上下文。spring提供了AOP上下文AopContext,因此通過AopContext,可以很方便的獲取到代理對象。

public class Myservice{ 
    @Transactional
    @Override
    public void method1() {
       ((Myservice)AopContext.currentProxy()).method2();
    }
 
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void method2() {
       xx
    }  
}

一運行,報錯了,因為exposeProxy默認為false,我們要暴露代理類,就要設置為true,可以在springboot啟動類上加一個注解

@EnableAspectJAutoProxy(exposeProxy = true)
  • 3、ApplicationContext

public class Myservice{ 
   @Autowired
    ApplicationContext context; 
    Myservice service;
 
    @PostConstruct  //初始化時調用,不加也行
    private void getMyservice() {
        service = context.getBean(Myservice.class);
    }     
 
    @Transactional
    @Override
    public void method1() {
      service.method2();
    }
 
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void method2() {
       xx
    }  
}

第二和第三種的區別就在于,2是直接獲取代理類,3是通過調用getBean間接獲取代理類,總的來說,第一種是最方便的,也是最推薦的做法。

3、傳播機制類型

下面的類型都是針對于被調用方法來說的,理解起來要想象成兩個 service 方法的調用才可以。

PROPAGATION_REQUIRED (默認)
  • 支持當前事務,如果當前沒有事務,則新建事務

  • 如果當前存在事務,則加入當前事務,合并成一個事務

REQUIRES_NEW (一般用在子方法需要單獨事務)
  • 新建事務,如果當前存在事務,則把當前事務掛起

  • 這個方法會獨立提交事務,不受調用者的事務影響,父級異常,它也是正常提交

  • (上面兩個類型是常用的,下面的比較少用)

NESTED
  • 如果當前存在事務,它將會成為父級事務的一個子事務,方法結束后并沒有提交,只有等父事務結束才提交

  • 如果當前沒有事務,則新建事務

  • 如果它異常,父級可以捕獲它的異常而不進行回滾,正常提交

  • 但如果父級異常,它必然回滾,這就是和 REQUIRES_NEW 的區別

SUPPORTS
  • 如果當前存在事務,則加入事務

  • 如果當前不存在事務,則以非事務方式運行,這個和不寫沒區別

NOT_SUPPORTED
  • 以非事務方式運行

  • 如果當前存在事務,則把當前事務掛起

MANDATORY
  • 如果當前存在事務,則運行在當前事務中

  • 如果當前無事務,則拋出異常,也即父級方法必須有事務

NEVER
  • 以非事務方式運行,如果當前存在事務,則拋出異常,即父級方法必須無事務

到此,相信大家對“spring的事務傳播機制詳細介紹”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

汤阴县| 洪洞县| 四会市| 孟津县| 岚皋县| 运城市| 萍乡市| 隆昌县| 泌阳县| 仁化县| 汤原县| 民县| 财经| 麦盖提县| 武义县| 肃宁县| 福贡县| 五华县| 新乐市| 贡嘎县| 应城市| 唐山市| 荆州市| 广南县| 高平市| 巴中市| 岳普湖县| 修武县| 泌阳县| 万源市| 巍山| 绍兴市| 江源县| 松阳县| 汝州市| 上蔡县| 陆丰市| 宕昌县| 股票| 承德县| 思南县|