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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Spring事務的傳播行為與回滾機制

Android編程精選 ? 來源:CSDN技術社區 ? 作者:范學博 ? 2022-07-25 15:57 ? 次閱讀

	

	

	

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

先簡單介紹一下Spring事務的傳播行為:

所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:

  • TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是默認值。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
  • TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED

然后說一下Spring事務的回滾機制:

Spring的AOP即聲明式事務管理默認是針對unchecked exception回滾。Spring的事務邊界是在調用業務方法之前開始的,業務方法執行完畢之后來執行commit or rollback(Spring默認取決于是否拋出runtimeException)。

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

再簡單介紹一下@Transactional注解底層實現方式吧,毫無疑問,是通過動態代理,那么動態代理又分為JDK自身和CGLIB,這個也不多贅述了,畢竟今天的主題是如何將@Transactional對于事物的控制應用到爐火純青。哈哈~


第一點要注意的就是在@Transactional注解的方法中,再調用本類中的其他方法method2時,那么method2方法上的@Transactional注解是不!會!生!效!的!但是加上也并不會報錯,拿圖片簡單幫助理解一下吧。這一點也是面試中會問到的事務失效的場景。

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

通過代理對象在目標對象前后進行方法增強,也就是事務的開啟提交和回滾。那么繼續調用本類中其他方法是怎樣呢,如下圖:

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

可見目標對象內部的自我調用,也就是通過this.指向的目標對象將不會執行方法的增強。


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

至于這個的原因,發表下個人的理解吧,因為JVM的動態代理是基于接口實現的,通過代理類將目標方法進行增強,想一下也是啦,沒有權限訪問那么你讓我怎么進行,,,好吧,這個我也沒有深入研究底層,個人理解個人理解。

在這里我也放個問題吧,希望有高手可以回復指點指點我,因為JVM動態代理是基于接口實現的,那么是不是service層都要按照接口和實現類的開發模式,注解才會生效呢,就是說controller層直接調用沒有接口的service層,加了注解也一樣不起作用吧,這個懶了,沒有測試,其一是因為沒有人會這么開發吧,其二是我就認為是不起作用的,哈哈

下面來解決一下第一點的問題,如何在方法中調用本類中其他方法呢。

通過AopContext.currentProxy ()獲取到本類的代理對象,再去調用就好啦。因為這個是CGLIB實現,所以要開啟AOP,當然也很簡單,在springboot啟動類上加上注解@EnableAspectJAutoProxy(exposeProxy = true)就可以啦,這個依賴大家自行搜一下就好啦。要注意,注意,代理對象調用的方法也要是public修飾符,否則方法中獲取不到注入的bean,會報空指針錯誤。

emmmm,我先把調用的方式和結果說下吧。自己簡單寫了代碼,有點粗糙,就不要介意啦,嘿嘿。。。

Controller中調用Service

@RestController
publicclassTransactionalController{

@Autowired
privateTransactionalServicetransactionalService;

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

Service中實現對事務的控制:接口

publicinterfaceTransactionalService{
voidtransactionalMethod();
}

Service中實現對事務的控制:實現類(各種情況的說明都寫在圖片里了,這樣方便閱讀,有助于快速理解吧)

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

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

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

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

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

如果想要方法1和方法2均單獨保持事務一致性怎么辦呢,剛說過了,如果不是用代理調用@Transactional注解是不生效的,所以一定要使用代理調用實現,然后讓方法1和方法2分別單獨開啟新的事務,便OK啦。下面擺上圖片。

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

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

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

接下來進行進一步的優化,可以在transactionalMethod方法中分別對方法1和方法2進行控制。要將代碼的藝術發揮到極致嘛,下面裝逼開始。

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

代碼太長了,超過屏幕了,粘貼出來截的圖,紅框注釋需要仔細看,希望不要影響你的閱讀體驗,至此,本篇關于@Transactioinal注解的使用就到此為止啦,

簡單總結一下吧:

1、就是@Transactional注解保證的是每個方法處在一個事務,如果有try一定在catch中拋出運行時異常。

2、方法必須是public修飾符。否則注解不會生效,但是加了注解也沒啥毛病,不會報錯,只是沒卵用而已。

3、this.本方法的調用,被調用方法上注解是不生效的,因為無法再次進行切面增強。


	

	

	

	

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14343
  • 注解
    +關注

    關注

    0

    文章

    18

    瀏覽量

    2674

原文標題:如何將 @Transactional 事務注解運用到爐火純青?

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Spring事務失效的十種常見場景

    Spring針對Java Transaction API (JTA)、JDBC、Hibernate和Java Persistence API(JPA)等事務 API,實現了一致的編程模型,而
    的頭像 發表于 12-11 15:03 ?915次閱讀

    Spring事務實現原理

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

    DRDS 柔性事務漫談

    或消息事務中,覆蓋問題需要由應用引入狀態、版本號、或樂觀鎖機制來規避。DRDS 柔性事務則使用了一些創新的方式來解決這個問題:1. 增
    發表于 06-11 19:48

    Spring事務分析的實現方式

    Spring事務原理分析
    發表于 07-02 15:19

    詳解Spring事務管理

    在學習spring事務管理時,我忍不住要問,spring為什么進行事務管理,spring怎么進行的事務
    發表于 07-12 06:54

    Spring事務管理詳解說明

    Spring事務管理詳解
    發表于 05-20 13:46

    事務深度遍歷過程詳解

    創建事務: 想顯式地一個事務,例如從一個條件代碼塊,可以調用failure方法,則事務將在程序塊的結束做無條件的
    發表于 12-11 12:34 ?1151次閱讀

    spring中聲明式事務實現原理猜想

    我們把事務開啟、提交或者回的操作,通過aop的方式進行管理。 通過 @Transactional 注解就能讓spring為我們管理事務,免去了重復的
    的頭像 發表于 10-13 09:20 ?1630次閱讀

    淺談Spring事務的那些坑

    對于從事java開發工作的同學來說,spring事務肯定再熟悉不過了。在某些業務場景下,如果同時有多張表的寫入操作,為了保證操作的原子性(要么同時成功,要么同時失敗)避免數據不一致的情況,我們一般都會使用spring
    的頭像 發表于 10-11 10:31 ?752次閱讀

    淺談Spring事務底層原理

    開啟Spring事務本質上就是增加了一個Advisor,但我們使用@EnableTransactionManagement注解來開啟Spring事務是,該注解代理的功能就是向
    的頭像 發表于 12-06 09:56 ?695次閱讀

    支付寶:多線程事務怎么

    可以發現子線程組執行時,有一個線程執行失敗,其他線程也會拋出異常,但是主線程中執行的刪除操作,沒有,@Transactional注解沒有生效。
    的頭像 發表于 01-09 11:42 ?1843次閱讀

    8個Spring事務失效的場景介紹

    作為Java開發工程師,相信大家對Spring事務的使用并不陌生。但是你可能只是停留在基礎的使用層面上,在遇到一些比較特殊的場景,事務可能沒有生效,直接在生產上暴露了,這可能就會導致比較嚴重的生產
    的頭像 發表于 05-11 10:41 ?675次閱讀
    8個<b class='flag-5'>Spring</b><b class='flag-5'>事務</b>失效的場景介紹

    多線程事務怎么?一個簡單示例演示多線程事務

    spring中可以使用@Transactional注解去控制事務,使出現異常時會進行,在多線程中,這個注解則不會生效,如果主線程需要先執行一些修改數據庫的操作,當子線程在進行處理
    發表于 08-09 12:22 ?669次閱讀
    多線程<b class='flag-5'>事務</b>怎么<b class='flag-5'>回</b><b class='flag-5'>滾</b>?一個簡單示例演示多線程<b class='flag-5'>事務</b>

    spring事務失效的一些場景

    對于從事java開發工作的同學來說,spring事務肯定再熟悉不過了。 在某些業務場景下,如果一個請求中,需要同時寫入多張表的數據。為了保證操作的原子性(要么同時成功,要么同時失敗),避免數據
    的頭像 發表于 10-08 14:27 ?448次閱讀
    <b class='flag-5'>spring</b><b class='flag-5'>事務</b>失效的一些場景

    Spring事務傳播性的相關知識

    本文主要介紹了Spring事務傳播性的相關知識。
    的頭像 發表于 01-10 09:29 ?447次閱讀
    <b class='flag-5'>Spring</b><b class='flag-5'>事務</b><b class='flag-5'>傳播</b>性的相關知識
    主站蜘蛛池模板: 2021精品国产综合久久| 黄色片xxxx| 久久99精品久久久久久野外| 成年网站在线播放| 免费大片av手机看片| 日本不卡视频在线| 欧美午夜影视| 天天爽天天干天天操| 亚洲日本在线观看| 日韩毛片一级| 看日本黄大片在线观看| 手机在线你懂得| 视频在线观看免费网址| 性欧美xxxx乳高跟| 色图视频| 午夜视频在线免费播放| 又粗又长又色又爽视频| 日本三级在线播放线观看2021| 一区在线观看| 亚洲伦理一区| 两性色午夜视频免费播放| 日韩一级片免费| 4438x成人网最大色成网站| 色老头综合| 国产片一级特黄aa的大片| 国产性夜夜性夜夜爽91| 亚洲高清美女一区二区三区| 毛片快播| 国产精品久久久久久久牛牛| 婷婷热| 国产一级aa大片毛片| 日本在线网址| 亚洲香蕉电影| 综合天天| 日本与大黑人xxxx| 日本高清色视频在线观看免费| 天天看天天摸色天天综合网| xxxx性xx另类| ww久久| 免费日本视频| 国产黄色大片又色又爽|