在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring事務(wù)的傳播行為與回滾機(jī)制

Android編程精選 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:范學(xué)博 ? 2022-07-25 15:57 ? 次閱讀

	

	

	

前兩天在工作中忙的焦頭爛額,涉及到@Transactional對(duì)于事務(wù)的控制,便仔細(xì)研究了一下,頗有所獲,花費(fèi)好了幾天測(cè)試整理,今天才發(fā)表出來(lái),希望看到博客的老鐵們能有所獲吧。話不多說(shuō)直奔正題。

先簡(jiǎn)單介紹一下Spring事務(wù)的傳播行為:

所謂事務(wù)的傳播行為是指,如果在開(kāi)始當(dāng)前事務(wù)之前,一個(gè)事務(wù)上下文已經(jīng)存在,此時(shí)有若干選項(xiàng)可以指定一個(gè)事務(wù)性方法的執(zhí)行行為。在TransactionDefinition定義中包括了如下幾個(gè)表示傳播行為的常量:

  • TransactionDefinition.PROPAGATION_REQUIRED:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。這是默認(rèn)值。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則拋出異常。
  • TransactionDefinition.PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)運(yùn)行;如果當(dāng)前沒(méi)有事務(wù),則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED

然后說(shuō)一下Spring事務(wù)的回滾機(jī)制:

Spring的AOP即聲明式事務(wù)管理默認(rèn)是針對(duì)unchecked exception回滾。Spring的事務(wù)邊界是在調(diào)用業(yè)務(wù)方法之前開(kāi)始的,業(yè)務(wù)方法執(zhí)行完畢之后來(lái)執(zhí)行commit or rollback(Spring默認(rèn)取決于是否拋出runtimeException)。

如果你在方法中有try{}catch(Exception e){}處理,那么try里面的代碼塊就脫離了事務(wù)的管理,若要事務(wù)生效需要在catch中throw new RuntimeException ("xxxxxx");這一點(diǎn)也是面試中會(huì)問(wèn)到的事務(wù)失效的場(chǎng)景。

再簡(jiǎn)單介紹一下@Transactional注解底層實(shí)現(xiàn)方式吧,毫無(wú)疑問(wèn),是通過(guò)動(dòng)態(tài)代理,那么動(dòng)態(tài)代理又分為JDK自身和CGLIB,這個(gè)也不多贅述了,畢竟今天的主題是如何將@Transactional對(duì)于事物的控制應(yīng)用到爐火純青。哈哈~


第一點(diǎn)要注意的就是在@Transactional注解的方法中,再調(diào)用本類(lèi)中的其他方法method2時(shí),那么method2方法上的@Transactional注解是不!會(huì)!生!效!的!但是加上也并不會(huì)報(bào)錯(cuò),拿圖片簡(jiǎn)單幫助理解一下吧。這一點(diǎn)也是面試中會(huì)問(wèn)到的事務(wù)失效的場(chǎng)景。

d290d560-0432-11ed-ba43-dac502259ad0.jpg

通過(guò)代理對(duì)象在目標(biāo)對(duì)象前后進(jìn)行方法增強(qiáng),也就是事務(wù)的開(kāi)啟提交和回滾。那么繼續(xù)調(diào)用本類(lèi)中其他方法是怎樣呢,如下圖:

d29e4c18-0432-11ed-ba43-dac502259ad0.jpg

可見(jiàn)目標(biāo)對(duì)象內(nèi)部的自我調(diào)用,也就是通過(guò)this.指向的目標(biāo)對(duì)象將不會(huì)執(zhí)行方法的增強(qiáng)。


先說(shuō)第二點(diǎn)需要注意的地方,等下說(shuō)如何解決上面第一點(diǎn)的問(wèn)題。第二點(diǎn)就是@Transactional注解的方法必須是公共方法,就是必須是public修飾符!!!

至于這個(gè)的原因,發(fā)表下個(gè)人的理解吧,因?yàn)镴VM的動(dòng)態(tài)代理是基于接口實(shí)現(xiàn)的,通過(guò)代理類(lèi)將目標(biāo)方法進(jìn)行增強(qiáng),想一下也是啦,沒(méi)有權(quán)限訪問(wèn)那么你讓我怎么進(jìn)行,,,好吧,這個(gè)我也沒(méi)有深入研究底層,個(gè)人理解個(gè)人理解。

在這里我也放個(gè)問(wèn)題吧,希望有高手可以回復(fù)指點(diǎn)指點(diǎn)我,因?yàn)镴VM動(dòng)態(tài)代理是基于接口實(shí)現(xiàn)的,那么是不是service層都要按照接口和實(shí)現(xiàn)類(lèi)的開(kāi)發(fā)模式,注解才會(huì)生效呢,就是說(shuō)controller層直接調(diào)用沒(méi)有接口的service層,加了注解也一樣不起作用吧,這個(gè)懶了,沒(méi)有測(cè)試,其一是因?yàn)闆](méi)有人會(huì)這么開(kāi)發(fā)吧,其二是我就認(rèn)為是不起作用的,哈哈

下面來(lái)解決一下第一點(diǎn)的問(wèn)題,如何在方法中調(diào)用本類(lèi)中其他方法呢。

通過(guò)AopContext.currentProxy ()獲取到本類(lèi)的代理對(duì)象,再去調(diào)用就好啦。因?yàn)檫@個(gè)是CGLIB實(shí)現(xiàn),所以要開(kāi)啟AOP,當(dāng)然也很簡(jiǎn)單,在springboot啟動(dòng)類(lèi)上加上注解@EnableAspectJAutoProxy(exposeProxy = true)就可以啦,這個(gè)依賴(lài)大家自行搜一下就好啦。要注意,注意,代理對(duì)象調(diào)用的方法也要是public修飾符,否則方法中獲取不到注入的bean,會(huì)報(bào)空指針錯(cuò)誤。

emmmm,我先把調(diào)用的方式和結(jié)果說(shuō)下吧。自己簡(jiǎn)單寫(xiě)了代碼,有點(diǎn)粗糙,就不要介意啦,嘿嘿。。。

Controller中調(diào)用Service

@RestController
publicclassTransactionalController{

@Autowired
privateTransactionalServicetransactionalService;

@PostMapping("transactionalTest")
publicvoidtransacionalTest(){
transactionalService.transactionalMethod();
}
}

Service中實(shí)現(xiàn)對(duì)事務(wù)的控制:接口

publicinterfaceTransactionalService{
voidtransactionalMethod();
}

Service中實(shí)現(xiàn)對(duì)事務(wù)的控制:實(shí)現(xiàn)類(lèi)(各種情況的說(shuō)明都寫(xiě)在圖片里了,這樣方便閱讀,有助于快速理解吧)

d2aba322-0432-11ed-ba43-dac502259ad0.png

d2b467dc-0432-11ed-ba43-dac502259ad0.png

上面兩種情況不管使不使用代理調(diào)用方法1和方法2,方法transactionalMethod都處在一個(gè)事務(wù)中,四條更新操作全部失敗。

那么有人可能會(huì)有疑問(wèn)了,在方法1和方法2上都加@Transactional注解呢?答案是結(jié)果和上面是一致的。

小結(jié)只要方法transactionalMethod上有注解,并且方法1和方法2都處于當(dāng)前事務(wù)中(不使用代理調(diào)用,方法1和方法2上的@Transactional注解是不生效的;使用代理,需要方法1和方法2都處在transactionalMethod方法的事務(wù)中,默認(rèn)或者嵌套事務(wù)均可,當(dāng)然也可以不加@Transactional注解),那么整體保持事務(wù)一致性。

如果想要方法1和方法2均單獨(dú)保持事務(wù)一致性怎么辦呢,剛說(shuō)過(guò)了,如果不是用代理調(diào)用@Transactional注解是不生效的,所以一定要使用代理調(diào)用實(shí)現(xiàn),然后讓方法1和方法2分別單獨(dú)開(kāi)啟新的事務(wù),便OK啦。下面擺上圖片。

d2c23e34-0432-11ed-ba43-dac502259ad0.png

d2d07198-0432-11ed-ba43-dac502259ad0.png

這兩種情況都是方法1和方法2均處在單獨(dú)的事務(wù)中,各自保持事務(wù)的一致性。

接下來(lái)進(jìn)行進(jìn)一步的優(yōu)化,可以在transactionalMethod方法中分別對(duì)方法1和方法2進(jìn)行控制。要將代碼的藝術(shù)發(fā)揮到極致嘛,下面裝逼開(kāi)始。

d2db9622-0432-11ed-ba43-dac502259ad0.png

代碼太長(zhǎng)了,超過(guò)屏幕了,粘貼出來(lái)截的圖,紅框注釋需要仔細(xì)看,希望不要影響你的閱讀體驗(yàn),至此,本篇關(guān)于@Transactioinal注解的使用就到此為止啦,

簡(jiǎn)單總結(jié)一下吧:

1、就是@Transactional注解保證的是每個(gè)方法處在一個(gè)事務(wù),如果有try一定在catch中拋出運(yùn)行時(shí)異常。

2、方法必須是public修飾符。否則注解不會(huì)生效,但是加了注解也沒(méi)啥毛病,不會(huì)報(bào)錯(cuò),只是沒(méi)卵用而已。

3、this.本方法的調(diào)用,被調(diào)用方法上注解是不生效的,因?yàn)闊o(wú)法再次進(jìn)行切面增強(qiáng)。


	

	

	

	

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14765
  • 注解
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    2727

原文標(biāo)題:如何將 @Transactional 事務(wù)注解運(yùn)用到爐火純青?

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Spring事務(wù)失效的十種常見(jiàn)場(chǎng)景

    Spring針對(duì)Java Transaction API (JTA)、JDBC、Hibernate和Java Persistence API(JPA)等事務(wù) API,實(shí)現(xiàn)了一致的編程模型,而
    的頭像 發(fā)表于 12-11 15:03 ?1099次閱讀

    Spring事務(wù)實(shí)現(xiàn)原理

    作者:京東零售 范錫軍 1、引言 springspring-tx模塊提供了對(duì)事務(wù)管理支持,使用spring事務(wù)可以讓我們從復(fù)雜的
    的頭像 發(fā)表于 11-08 10:10 ?1036次閱讀
    <b class='flag-5'>Spring</b><b class='flag-5'>事務(wù)</b>實(shí)現(xiàn)原理

    DRDS 柔性事務(wù)漫談

    或消息事務(wù)中,覆蓋問(wèn)題需要由應(yīng)用引入狀態(tài)、版本號(hào)、或樂(lè)觀鎖機(jī)制來(lái)規(guī)避。DRDS 柔性事務(wù)則使用了一些創(chuàng)新的方式來(lái)解決這個(gè)問(wèn)題:1. 增
    發(fā)表于 06-11 19:48

    Spring事務(wù)分析的實(shí)現(xiàn)方式

    Spring事務(wù)原理分析
    發(fā)表于 07-02 15:19

    詳解Spring事務(wù)管理

    在學(xué)習(xí)spring事務(wù)管理時(shí),我忍不住要問(wèn),spring為什么進(jìn)行事務(wù)管理,spring怎么進(jìn)行的事務(wù)
    發(fā)表于 07-12 06:54

    Spring事務(wù)管理詳解說(shuō)明

    Spring事務(wù)管理詳解
    發(fā)表于 05-20 13:46

    事務(wù)深度遍歷過(guò)程詳解

    創(chuàng)建事務(wù): 想顯式地一個(gè)事務(wù),例如從一個(gè)條件代碼塊,可以調(diào)用failure方法,則事務(wù)將在程序塊的結(jié)束做無(wú)條件的
    發(fā)表于 12-11 12:34 ?1212次閱讀

    spring中聲明式事務(wù)實(shí)現(xiàn)原理猜想

    我們把事務(wù)開(kāi)啟、提交或者回的操作,通過(guò)aop的方式進(jìn)行管理。 通過(guò) @Transactional 注解就能讓spring為我們管理事務(wù),免去了重復(fù)的
    的頭像 發(fā)表于 10-13 09:20 ?1723次閱讀

    淺談Spring事務(wù)的那些坑

    對(duì)于從事java開(kāi)發(fā)工作的同學(xué)來(lái)說(shuō),spring事務(wù)肯定再熟悉不過(guò)了。在某些業(yè)務(wù)場(chǎng)景下,如果同時(shí)有多張表的寫(xiě)入操作,為了保證操作的原子性(要么同時(shí)成功,要么同時(shí)失敗)避免數(shù)據(jù)不一致的情況,我們一般都會(huì)使用spring
    的頭像 發(fā)表于 10-11 10:31 ?860次閱讀

    淺談Spring事務(wù)底層原理

    開(kāi)啟Spring事務(wù)本質(zhì)上就是增加了一個(gè)Advisor,但我們使用@EnableTransactionManagement注解來(lái)開(kāi)啟Spring事務(wù)是,該注解代理的功能就是向
    的頭像 發(fā)表于 12-06 09:56 ?806次閱讀

    支付寶:多線程事務(wù)怎么

    可以發(fā)現(xiàn)子線程組執(zhí)行時(shí),有一個(gè)線程執(zhí)行失敗,其他線程也會(huì)拋出異常,但是主線程中執(zhí)行的刪除操作,沒(méi)有,@Transactional注解沒(méi)有生效。
    的頭像 發(fā)表于 01-09 11:42 ?1989次閱讀

    8個(gè)Spring事務(wù)失效的場(chǎng)景介紹

    作為Java開(kāi)發(fā)工程師,相信大家對(duì)Spring事務(wù)的使用并不陌生。但是你可能只是停留在基礎(chǔ)的使用層面上,在遇到一些比較特殊的場(chǎng)景,事務(wù)可能沒(méi)有生效,直接在生產(chǎn)上暴露了,這可能就會(huì)導(dǎo)致比較嚴(yán)重的生產(chǎn)
    的頭像 發(fā)表于 05-11 10:41 ?799次閱讀
    8個(gè)<b class='flag-5'>Spring</b><b class='flag-5'>事務(wù)</b>失效的場(chǎng)景介紹

    多線程事務(wù)怎么?一個(gè)簡(jiǎn)單示例演示多線程事務(wù)

    spring中可以使用@Transactional注解去控制事務(wù),使出現(xiàn)異常時(shí)會(huì)進(jìn)行,在多線程中,這個(gè)注解則不會(huì)生效,如果主線程需要先執(zhí)行一些修改數(shù)據(jù)庫(kù)的操作,當(dāng)子線程在進(jìn)行處理
    發(fā)表于 08-09 12:22 ?778次閱讀
    多線程<b class='flag-5'>事務(wù)</b>怎么<b class='flag-5'>回</b><b class='flag-5'>滾</b>?一個(gè)簡(jiǎn)單示例演示多線程<b class='flag-5'>事務(wù)</b>

    spring事務(wù)失效的一些場(chǎng)景

    對(duì)于從事java開(kāi)發(fā)工作的同學(xué)來(lái)說(shuō),spring事務(wù)肯定再熟悉不過(guò)了。 在某些業(yè)務(wù)場(chǎng)景下,如果一個(gè)請(qǐng)求中,需要同時(shí)寫(xiě)入多張表的數(shù)據(jù)。為了保證操作的原子性(要么同時(shí)成功,要么同時(shí)失敗),避免數(shù)據(jù)
    的頭像 發(fā)表于 10-08 14:27 ?582次閱讀
    <b class='flag-5'>spring</b><b class='flag-5'>事務(wù)</b>失效的一些場(chǎng)景

    Spring事務(wù)傳播性的相關(guān)知識(shí)

    本文主要介紹了Spring事務(wù)傳播性的相關(guān)知識(shí)。
    的頭像 發(fā)表于 01-10 09:29 ?608次閱讀
    <b class='flag-5'>Spring</b><b class='flag-5'>事務(wù)</b><b class='flag-5'>傳播</b>性的相關(guān)知識(shí)
    主站蜘蛛池模板: 色天使在线播放 | 一级爱片 | 69xxxx日本| 五月桃花网婷婷亚洲综合 | 天天插天天爱 | 中文字幕在线永久在线视频2020 | 亚洲免费视频观看 | 淫www| 91久久青草精品38国产 | 免费看欧美一级特黄α大片 | 午夜影院亚洲 | 久久久久国产精品四虎 | 天堂男人在线 | 国产精品单位女同事在线 | 免费观看黄视频网站 | 人人狠狠综合88综合久久 | 黄色综合 | 亚洲乱码一区二区三区在线观看 | 国产日韩欧美一区二区 | 亚洲资源在线观看 | 色综合一区二区三区 | 在线你懂的网址 | 久操操操| 特黄色片 | 香蕉色综合 | 免费午夜网站 | 日本三级精品 | 欧美成人午夜毛片免费影院 | 性欧美黑人 | 色咪网 | 福利一区二区在线观看 | 亚洲国产精品婷婷久久 | 天堂在线看 | 天天摸天天添人人澡 | 小说区v天堂网 | 一级特级毛片免费 | 亚洲一区不卡视频 | 一级 黄 色 毛片 | 台湾佬自偷自拍情侣在线 | vip免费观看 | 欧美网站色 |