国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring事務傳播機制、實現(xiàn)方式、失效場景即原理

這篇具有很好參考價值的文章主要介紹了Spring事務傳播機制、實現(xiàn)方式、失效場景即原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

貼一篇源碼分析的好文章:https://blog.csdn.net/qq_30905661/article/details/114400417

本質(zhì):

一個事務對應一個數(shù)據(jù)庫連接。
通過 this 來調(diào)用某個帶有 @Transactional 注解的方法時,這個注解是失效的

Spring的事務是如何實現(xiàn)的?

  1. spring事務底層是通過數(shù)據(jù)庫事務和AOP實現(xiàn)的
  2. 首先對于使用@Transactional的注解的bean,spring會創(chuàng)建一個代理對象作為bean
  3. 當調(diào)用代理對象的方法時,spring會判斷該方法上是否加了@Transactional注解
  4. 如果加了,就會利用事務管理器創(chuàng)建一個數(shù)據(jù)庫連接,并修改數(shù)據(jù)庫連接的 autocommit 為 false,禁止自動提交
  5. 然后執(zhí)行該方法,若方法沒有拋異常則會提交事務,反之亦然
  6. spring事物的隔離級別就是對應數(shù)據(jù)庫的隔離級別
  7. spring事務的傳播機制是spring自己實現(xiàn)的,是spring事務中最復雜的
  8. spring事物的傳播機制是基于數(shù)據(jù)庫連接來做的,一個連接一個事務,傳播事務實際上是開了一個新的數(shù)據(jù)庫連接,在此基礎上執(zhí)行sql

Spring事物的傳播機制?

spring事務默認是注解是 REQUIRED,支持事務的傳播,使用同一個數(shù)據(jù)庫連接。
Spring事務傳播機制、實現(xiàn)方式、失效場景即原理,spring,spring,數(shù)據(jù)庫

REQUIRED:spring默認的事務傳播機制,A存在事務,則B加入A的事務;A沒有事務則會新建一個數(shù)據(jù)庫事務;

SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務;如果當前不存在事務,就以非事務執(zhí)行

MANDATORY:(強制性使用第一個事務)A存在事務,則B加入A的事務;A沒有事務,則拋異常

REQUIRES_NEW:創(chuàng)建一個新事務,B在這個新事務中執(zhí)行;A如果有事務將會被掛起,等待B事務方法執(zhí)行結束(commit or rollback),當B事務執(zhí)行結束后,A事務被喚醒繼續(xù)執(zhí)行,若B拋出了異常給A 或 A 方法執(zhí)行出了異常,那么在 A 事務中執(zhí)行的 sql 將會被回滾,B 事務中的sql 由B的事務管理器控制,A、B中的sql不在同一數(shù)據(jù)庫連接中執(zhí)行,即內(nèi)層事務B已經(jīng) commit 或 rollback, 外層事務干擾不了。

NOT_SUPPORTED:(不支持事務),若A存在事務,則掛起A的事務,以非事務方式運行

NEVER:(不支持事務),若A存在事務拋異常

NESTED:A存在事務,則在嵌套事務中執(zhí)行;不存在則和 REQUIRED 一樣開啟一個新事務
Spring事務傳播機制、實現(xiàn)方式、失效場景即原理,spring,spring,數(shù)據(jù)庫

那些情況會導致Spring事務的失效?失效的原因是?

  1. 數(shù)據(jù)庫不支持事務

  2. 類沒有被spring管理(ioc),沒有加注解。

  3. 未啟用Spring事務管理功能(@EnableTransactionManagement)

  4. 數(shù)據(jù)源沒有配置事務管理器

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }
    
  5. 沒有加@Configuration注解:springboot基本沒有這個問題;Spring可能會出現(xiàn)這個問題,原因是由于mybatis或JdbcTemplate會從ThreadLocal中獲取數(shù)據(jù)庫連接,但是ThreadLocal底層引用的是ThreadLocalMap,Map的key是一個DataSource對象,value是數(shù)據(jù)庫連接。如果沒有加@Configuration注解的話,會導致Map中的DataSource對象和mybatis、jdbcTenplate中的DataSource對象不相等,所有就拿不到數(shù)據(jù)庫連接,以至于自己去創(chuàng)建連接了。

  6. 異常被吃掉:默認情況下Spring會捕獲 error 和 RunTimeException ,spring捕獲不到異常也就不會回滾了,例如 try-catch

  7. 方法是private的:spring事務基于CGLIB來進行AOP,CGLIB是基于父子類來實現(xiàn),子類是代理類,子類無法重寫父類的private方法,也就沒有辦法增加spring事務邏輯。

  8. 方法是 final 修飾的,和private原因一致,子類不能重寫增強。

  9. 調(diào)用A方法和B方法不是同一個線程,不同的線程拿到的數(shù)據(jù)庫連接不一樣。TransactionSynchronizationManager.bindResource 會將線程與數(shù)據(jù)庫連接綁定。

  10. rollbackFor = RuntimeException.class(默認),當拋出的異常大于定義的異常,則會導致事務失效

  11. 方法內(nèi)自調(diào)用時對象不是同一個:Spring事務是基于Aop,只有使用代理對象調(diào)用 A 方法時,注解才能生效,而在A方法中調(diào)用 B 方法時( this.B() ),并不是使用的代理對象,所以導致B的注解失效。

自身調(diào)用失效問題:

方法A 通過 this.B() 調(diào)用方法B。
Spring事務傳播機制、實現(xiàn)方式、失效場景即原理,spring,spring,數(shù)據(jù)庫

通過 this 來調(diào)用某個帶有 @Transactional 注解的方法時,這個注解是失效的,可以看做這個方法(如上圖B)上沒有這個注解,當然書寫的傳播機制限制也是無效的,例如:propagation = Propagation.MANDATORY、propagation = Propagation.NEVER。
但是若調(diào)用A的是CGLIB生成的代理對象,并且A上有 @Transactional 注解,那么方法A是具有事務的,方法B中的sql 就在方法A的事務中執(zhí)行,所以整體A,B是有事務的。

調(diào)用使用@Transactional注解的方法時,使用的是 Spring CGLIB 創(chuàng)建的代理對象
Spring事務傳播機制、實現(xiàn)方式、失效場景即原理,spring,spring,數(shù)據(jù)庫

調(diào)用B方法的是存儲在 Spring ioc容器的bean,兩個不同的對象
Spring事務傳播機制、實現(xiàn)方式、失效場景即原理,spring,spring,數(shù)據(jù)庫

A調(diào)用B的結論:

  • 只要A加@Transactional注解,A和B在不在同一個類中,B加不加@Transactional注解,事務都是有效的,則AB在同一事務中。
  • A 不加 B加,A和B同一個類中:調(diào)用A方法的是CGLIB生成的代理對象,但是A方法沒有注解,所以A方法不會被攔截;this調(diào)用B,注解失效(下圖)。
  • A 不加 B加,A和B不在同一個類中:不在同一個類,那么調(diào)用B的就是的就是CGLIB生成的代理對象,B的事務有效,A在外圍沒有事務(B已經(jīng)commit或rollback了,事務管理器已經(jīng)把設置auto commit = false的數(shù)據(jù)庫連接釋放了)。

Spring事務傳播機制、實現(xiàn)方式、失效場景即原理,spring,spring,數(shù)據(jù)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-624377.html

到了這里,關于Spring事務傳播機制、實現(xiàn)方式、失效場景即原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Spring事務的四大特性+事務的傳播機制+隔離機制

    Spring事務的四大特性+事務的傳播機制+隔離機制

    原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發(fā)生,要么都不發(fā)生。 事務是一個原子操作, 由一系列動作組成。 組成一個事務的多個數(shù)據(jù)庫操作是一個不可分割的原子單元 ,只有所有的操作執(zhí)行成功,整個事務才提交。 事務中的任何一個數(shù)據(jù)庫操作失敗

    2024年01月20日
    瀏覽(32)
  • Spring Boot 事務和事務傳播機制

    Spring Boot 事務和事務傳播機制

    事務定義 將一組操作封裝成一個執(zhí)行單元 (封裝到一起),這一組的執(zhí)行具備原子性, 那么就要么全部成功,要么全部失敗. 為什么要用事務? 比如轉(zhuǎn)賬分為兩個操作: 第一步操作:A 賬戶-100 元。 第二步操作:B賬戶 +100 元。 如果沒有事務,第一步執(zhí)行成功了,第二步執(zhí)行失敗了,

    2024年02月11日
    瀏覽(26)
  • Spring事務傳播機制解析

    在Java的Spring框架中,事務管理是保證應用數(shù)據(jù)一致性和可靠性的關鍵。Spring提供了靈活的事務傳播機制,它定義了事務邊界,以及在嵌套方法調(diào)用時如何處理事務。本文旨在深入探討Spring的事務傳播行為,幫助開發(fā)者更好地理解和運用這一重要特性。 事務傳播機制指的是在

    2024年01月16日
    瀏覽(35)
  • spring的事務傳播機制

    spring的事務傳播機制

    嫌棄內(nèi)容代碼復雜的可直接看思維導圖大綱即可 指的就是當一個事務方法被另一個事務方法調(diào)用時,這個事務方法應該如何進行 默認,當前存在事務,則加入該事務;不存在事務,創(chuàng)建新事務。 始終以新的事務運行,當前存在事務,則掛起原事務;不存在事務,創(chuàng)建新事務

    2023年04月23日
    瀏覽(39)
  • Spring事務傳播機制

    Spring事務傳播機制

    編程式事務管理:通過? TransactionTemplate 或者 TransactionManager 手動管理事務,實際應用中很少使用,這不是本文的重點,就不在這里贅述。 聲明式事務管理:使用場景最多,也是最推薦使用的方式,直接加上@Transactional注解即可。 @Transactional 注解是用于聲明事務性方法的注解

    2024年01月16日
    瀏覽(43)
  • 【JavaEE進階】Spring事務和事務傳播機制

    【JavaEE進階】Spring事務和事務傳播機制

    Spring 事務是 Spring 框架提供的一種機制,用于 管理數(shù)據(jù)庫操作或其他資源的一組相關操作 ,以確保它們在一個原子、一致、可靠和隔離的執(zhí)行單元內(nèi)進行。事務用于維護數(shù)據(jù)的完整性并支持并發(fā)訪問數(shù)據(jù)庫時的數(shù)據(jù)一致性。 Spring 事務的主要特點包括: 原子性(Atomicity):

    2024年02月09日
    瀏覽(22)
  • 一文詳解Spring事務傳播機制

    一文詳解Spring事務傳播機制

    目錄 背景 Spring事務 @Transactional注解 使用場景 失效場景 原理 常用參數(shù) 注意 事務傳播機制 處理嵌套事務流程 主事務為REQUIRED子事務為REQUIRED 主事務為REQUIRED子事務為REQUIRES_NEW 主事務為REQUIRED子事務為NESTED 實現(xiàn)方式 源碼解析 我們在使用Spring管理數(shù)據(jù)庫事務的時候很方便,只

    2023年04月26日
    瀏覽(21)
  • 【Spring】深入理解 Spring 事務及其傳播機制

    【Spring】深入理解 Spring 事務及其傳播機制

    在 Spring 框架中,事務(Transaction)是一種用于管理數(shù)據(jù)庫操作的機制,旨在 確保數(shù)據(jù)的 一致性、可靠性和完整性 。事務可以將一組數(shù)據(jù)庫操作(如插入、更新、刪除等)視為一個單獨的執(zhí)行單元,要么 全部成功地執(zhí)行,要么全部回滾 。這樣可以確保數(shù)據(jù)庫在任何時候都保

    2024年02月12日
    瀏覽(30)
  • Spring @Transactional事務傳播機制詳解

    我們?nèi)粘9ぷ髦袠O少使用事務傳播級別,單純只是使用事務和rollbackfor拋出異常來解決事務問題,但其實我們很多時候使用的是不正確的,或者說會造成事務粒度過大,本文詳解一下事務傳播級別,也讓自己更好地處理事務問題。 1.什么是事務傳播機制? 舉個栗子,方法A是一

    2024年02月14日
    瀏覽(25)
  • Spring事務傳播的7種機制

    Spring事務傳播的7種機制

    1. Propagation.REQUIRED:默認的事務傳播級別,它表示如果當前存在事務,則加入該事務;如果 當前沒有事務,則創(chuàng)建一個新的事務。 2. Propagation.SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的 方式繼續(xù)運行。 3. Propagation.MANDATORY:(mandatory:強制

    2024年02月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包