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

老生常談spring的事務(wù)傳播機(jī)制

 更新時(shí)間:2021年09月07日 10:26:26   作者:林蝸牛snail  
這篇文章主要介紹了spring的事務(wù)傳播機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

spring的事務(wù)傳播機(jī)制

背景:實(shí)習(xí)期間幾次遇到事務(wù)方法,有一次本地測(cè)試時(shí)發(fā)現(xiàn)事務(wù)沒(méi)有回滾,就把簡(jiǎn)單描述寫(xiě)在wx上,今天來(lái)給spring事務(wù)做個(gè)自我總結(jié)。

1、why

為什么會(huì)有事務(wù)傳播機(jī)制?

場(chǎng)景一:

  • serviceA 方法調(diào)用了 serviceB 方法,但兩個(gè)方法都有事務(wù),這個(gè)時(shí)候如果 serviceB 方法異常,是讓 serviceB 方法提交,還是兩個(gè)一起回滾。

場(chǎng)景二:

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

場(chǎng)景三:

  • serviceA 方法調(diào)用了 serviceB 方法,兩者都有事務(wù),serviceB 已經(jīng)正常執(zhí)行完,但 serviceA 異常,是否需要回滾 serviceB 的數(shù)據(jù)。

所以,我們需要有對(duì)應(yīng)的事務(wù)傳播機(jī)制來(lái)控制事務(wù)。

2、傳播機(jī)制生效的條件

有了spring事務(wù)傳播機(jī)制,那這種機(jī)制存在的條件呢?我們知道,spring的事務(wù)是基于aop的,確切來(lái)說(shuō),是基于JDK動(dòng)態(tài)代理的AOP,這種AOP有什么特點(diǎn)呢? 它是基于類或者接口的,也就是說(shuō),當(dāng) @Transactional寫(xiě)在一個(gè)方法上時(shí),這個(gè)方法將會(huì)被spring動(dòng)態(tài)代理, 生成一個(gè)動(dòng)態(tài)代理類, 對(duì)原方法進(jìn)行修飾增強(qiáng),但是要注意!! 原先的方法的類并沒(méi)有什么不同,并沒(méi)有事務(wù),spring動(dòng)態(tài)代理這個(gè)類生成的代理類才有事務(wù),才有增強(qiáng),也就是說(shuō),在同一個(gè)類里面通過(guò)this.xx()調(diào)用本類的事務(wù)方法時(shí),事務(wù)是不會(huì)生效的,因?yàn)槟阏{(diào)用的不是代理類。

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

解決方案

關(guān)鍵在于獲取類的代理對(duì)象,而不是通過(guò)this去調(diào)用,所以以下方法都是基于這個(gè)關(guān)鍵點(diǎn)去解決的。

  • 1、最簡(jiǎn)單的,兩個(gè)事務(wù)方法放在不同的service里面,這個(gè)比較簡(jiǎn)單,就不給例子了。(推薦)
  • 2、AOP上下文。spring提供了AOP上下文AopContext,因此通過(guò)AopContext,可以很方便的獲取到代理對(duì)象。
public class Myservice{ 
    @Transactional
    @Override
    public void method1() {
       ((Myservice)AopContext.currentProxy()).method2();
    }
 
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void method2() {
       xx
    }  
}

一運(yùn)行,報(bào)錯(cuò)了,因?yàn)閑xposeProxy默認(rèn)為false,我們要暴露代理類,就要設(shè)置為true,可以在springboot啟動(dòng)類上加一個(gè)注解

@EnableAspectJAutoProxy(exposeProxy = true)
  • 3、ApplicationContext
public class Myservice{ 
   @Autowired
    ApplicationContext context; 
    Myservice service;
 
    @PostConstruct  //初始化時(shí)調(diào)用,不加也行
    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
    }  
}

第二和第三種的區(qū)別就在于,2是直接獲取代理類,3是通過(guò)調(diào)用getBean間接獲取代理類,總的來(lái)說(shuō),第一種是最方便的,也是最推薦的做法。

3、傳播機(jī)制類型

下面的類型都是針對(duì)于被調(diào)用方法來(lái)說(shuō)的,理解起來(lái)要想象成兩個(gè) service 方法的調(diào)用才可以。

PROPAGATION_REQUIRED (默認(rèn))

  • 支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),則新建事務(wù)
  • 如果當(dāng)前存在事務(wù),則加入當(dāng)前事務(wù),合并成一個(gè)事務(wù)

REQUIRES_NEW (一般用在子方法需要單獨(dú)事務(wù))

  • 新建事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起
  • 這個(gè)方法會(huì)獨(dú)立提交事務(wù),不受調(diào)用者的事務(wù)影響,父級(jí)異常,它也是正常提交
  • (上面兩個(gè)類型是常用的,下面的比較少用)

NESTED

  • 如果當(dāng)前存在事務(wù),它將會(huì)成為父級(jí)事務(wù)的一個(gè)子事務(wù),方法結(jié)束后并沒(méi)有提交,只有等父事務(wù)結(jié)束才提交
  • 如果當(dāng)前沒(méi)有事務(wù),則新建事務(wù)
  • 如果它異常,父級(jí)可以捕獲它的異常而不進(jìn)行回滾,正常提交
  • 但如果父級(jí)異常,它必然回滾,這就是和 REQUIRES_NEW 的區(qū)別

SUPPORTS

  • 如果當(dāng)前存在事務(wù),則加入事務(wù)
  • 如果當(dāng)前不存在事務(wù),則以非事務(wù)方式運(yùn)行,這個(gè)和不寫(xiě)沒(méi)區(qū)別

NOT_SUPPORTED

  • 以非事務(wù)方式運(yùn)行
  • 如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起

MANDATORY

  • 如果當(dāng)前存在事務(wù),則運(yùn)行在當(dāng)前事務(wù)中
  • 如果當(dāng)前無(wú)事務(wù),則拋出異常,也即父級(jí)方法必須有事務(wù)

NEVER

  • 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常,即父級(jí)方法必須無(wú)事務(wù)

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

相關(guān)文章

  • Mybatis調(diào)用視圖和存儲(chǔ)過(guò)程的方法

    Mybatis調(diào)用視圖和存儲(chǔ)過(guò)程的方法

    MyBatis支持普通sql的查詢、視圖的查詢、存儲(chǔ)過(guò)程調(diào)用,是一種非常優(yōu)秀的持久層框架。接下來(lái)通過(guò)本文給大家介紹mybatis調(diào)用視圖和存儲(chǔ)過(guò)程的方法,感興趣的朋友一起看看吧
    2016-10-10
  • 關(guān)于Spring中@Transactional事務(wù)回滾的注意事項(xiàng)

    關(guān)于Spring中@Transactional事務(wù)回滾的注意事項(xiàng)

    這篇文章主要介紹了關(guān)于Spring中@Transactional事務(wù)回滾的注意事項(xiàng),回滾(Rollback)指的是程序或數(shù)據(jù)處理錯(cuò)誤,將程序或數(shù)據(jù)恢復(fù)到上一次正確狀態(tài)的行為。回滾包括程序回滾和數(shù)據(jù)回滾等類型,需要的朋友可以參考下
    2023-05-05
  • springboot之Jpa通用接口及公共方法使用示例

    springboot之Jpa通用接口及公共方法使用示例

    這篇文章主要為大家介紹了springboot?之Jpa通用接口及公共方法使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • java高效讀大文件(csv,text)的幾種處理方式

    java高效讀大文件(csv,text)的幾種處理方式

    這篇文章主要給大家介紹了關(guān)于java高效讀大文件(csv,text)的幾種處理方式,Java中處理大文件時(shí),通常需要采取一些特定的策略來(lái)避免內(nèi)存溢出或性能問(wèn)題,文中通過(guò)代碼及圖片介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Java如何設(shè)置系統(tǒng)參數(shù)和運(yùn)行參數(shù)

    Java如何設(shè)置系統(tǒng)參數(shù)和運(yùn)行參數(shù)

    這篇文章主要介紹了Java如何設(shè)置系統(tǒng)參數(shù)和運(yùn)行參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 詳解如何熟練使用java函數(shù)式接口

    詳解如何熟練使用java函數(shù)式接口

    最近剛好有空給大家整理下JDK8的特性,這個(gè)在實(shí)際開(kāi)發(fā)中的作用也是越來(lái)越重了,本文重點(diǎn)講解下函數(shù)式接口內(nèi)容,需要的朋友可以參考下
    2021-06-06
  • MyBatisCodeHelperPro最新激活方法(有效方法)

    MyBatisCodeHelperPro最新激活方法(有效方法)

    這篇文章主要介紹了MyBatisCodeHelperPro最新激活方法親測(cè)有效,非常好用,小編今天以idea2021.2.1為例給大家詳細(xì)講解,需要的朋友可以參考下
    2022-08-08
  • java實(shí)現(xiàn)高效下載文件的方法

    java實(shí)現(xiàn)高效下載文件的方法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)高效下載文件的幾種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 關(guān)于Java8的foreach中使用return/break/continue產(chǎn)生的問(wèn)題

    關(guān)于Java8的foreach中使用return/break/continue產(chǎn)生的問(wèn)題

    這篇文章主要介紹了關(guān)于Java8的foreach()中使用return/break/continue產(chǎn)生的問(wèn)題,在使用foreach()處理集合時(shí)不能使用break和continue這兩個(gè)方法,也就是說(shuō)不能按照普通的for循環(huán)遍歷集合時(shí)那樣根據(jù)條件來(lái)中止遍歷,需要的朋友可以參考下
    2023-10-10
  • Springboot使用ResponseBody漢字返回問(wèn)號(hào)問(wèn)題

    Springboot使用ResponseBody漢字返回問(wèn)號(hào)問(wèn)題

    這篇文章主要介紹了Springboot使用ResponseBody漢字返回問(wèn)號(hào)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論

玉树县| 兰西县| 肇州县| 裕民县| 尉氏县| 昌图县| 霍城县| 德州市| 嘉鱼县| 天等县| 曲水县| 朝阳市| 罗田县| 普洱| 阿拉善左旗| 松阳县| 犍为县| 武功县| 青海省| 南汇区| 晋中市| 麻城市| 基隆市| 乌鲁木齐市| 蓝田县| 乾安县| 九龙坡区| 米泉市| 泸水县| 交城县| 依安县| 新竹市| 青神县| 大兴区| 荔浦县| 东丰县| 扶余县| 菏泽市| 八宿县| 曲松县| 三亚市|