日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

事務中存在多線程,怎么處理?

來源: 責編: 時間:2024-06-12 17:29:02 214觀看
導讀在 Spring 框架中,@Transactional 注解作為一種聲明式事務管理的關鍵機制,其背后的工作原理遠比簡單的 AOP(面向切面編程)和 ThreadLocal 存儲更為細膩。該注解的實現核心在于 Spring 的 TransactionInterceptor(事務攔截

在 Spring 框架中,@Transactional 注解作為一種聲明式事務管理的關鍵機制,其背后的工作原理遠比簡單的 AOP(面向切面編程)和 ThreadLocal 存儲更為細膩。該注解的實現核心在于 Spring 的 TransactionInterceptor(事務攔截器)以及它如何與 Spring 的代理機制、TransactionManager(事務管理器)協同工作,來確保事務的開啟、提交或回滾等操作得以正確執行。rW928資訊網——每日最新資訊28at.com

一 注解解析與代理生成

當 Spring 容器初始化時,會通過 AnnotationTransactionAttributeSource 掃描并識別出所有標有 @Transactional 的方法。這些方法在被調用前,Spring 會根據配置(如基于接口或類的代理)為它們創建動態代理對象。如果是基于接口的代理,則使用 JDK Dynamic Proxy;如果是基于類的,則采用 CGLIB。這個代理對象會在目標方法調用前后插入事務處理邏輯。rW928資訊網——每日最新資訊28at.com

1.1 Spring Bean的后處理器

一切始于 Spring 容器的 Bean 創建和初始化過程。Spring 通過一系列的 BeanPostProcessor 接口實現類來增強 Bean 的功能,其中與事務管理密切相關的便是 AbstractAutoProxyCreator的子類,如 AnnotationAwareAspectJAutoProxyCreator。這個類負責掃描并創建代理對象,以便于在運行時織入諸如事務管理這樣的切面邏輯。rW928資訊網——每日最新資訊28at.com

1.2 識別 @Transactional 注解

  • ClassPathScanningCandidateComponentProvider:Spring 首先會使用此類掃描指定包路徑下帶有特定注解(如@Transactional)的類或方法。
  • AnnotationTransactionAttributeSource:一旦找到帶有 @Transactional 注解的類或方法,Spring 會使用 AnnotationTransactionAttributeSource 來解析這些注解,將其轉換為事務屬性(TransactionAttribute),比如事務的隔離級別、傳播行為、超時時間等。

1.3 創建代理對象

  • 對于基于接口的代理,Spring 使用 JDK 的動態代理技術,通過JdkDynamicAopProxy創建代理對象。該代理會檢查調用鏈,并在調用目標方法前插入事務管理的前置邏輯,調用后插入后置邏輯(如提交或回滾事務)。
  • 對于沒有實現接口的類,Spring 則利用 CGLIB 庫生成目標類的子類作為代理,通過CglibAopProxy 來完成。CGLIB 代理同樣能夠在目標方法調用的前后插入事務管理代碼。

1.4 TransactionInterceptor

  • 在代理對象中,事務管理的具體邏輯是由 TransactionInterceptor(事務攔截器)來執行的。它實現了 MethodInterceptor 接口,因此當代理對象的方法被調用時,會進入invoke(MethodInvocation invocation) 方法。在這個方法內,TransactionInterceptor 根據解析出的事務屬性來決定是否開啟事務、使用何種傳播行為,并最終調用目標方法。

總結下就是,Spring 通過 Bean 的后置處理器在容器初始化階段自動檢測帶有 @Transactional 注解的類和方法,并通過動態代理機制為這些組件創建代理對象。代理對象在方法調用時,通過 TransactionInterceptor 這一核心組件,根據注解配置的事務屬性來管理事務生命周期,確保事務邏輯的無縫集成。rW928資訊網——每日最新資訊28at.com

二 事務攔截與執行

2.1 TransactionInterceptor 的作用

TransactionInterceptor 實現了 Spring 的 MethodInterceptor 接口,這意味著它能夠攔截方法調用,并在調用前后執行額外的邏輯,即事務管理邏輯。其核心職責包括:rW928資訊網——每日最新資訊28at.com

  • 識別是否需要事務: 根據目標方法上的 @Transactional 注解(如果有的話)及其屬性(如傳播行為、隔離級別、超時時間等),決定是否需要啟動一個新的事務或加入到現有的事務中。需要注意的是,事務上下文(包括連接信息等)被存儲在由 Spring 管理的一個特定的 TransactionSynchronizationManager 中,TransactionSynchronizationManager 內部使用了 ThreadLocal。
  • 事務管理: 在方法調用之前開啟事務,調用之后根據方法執行結果提交或回滾事務。這包括異常處理邏輯,即在遇到未被捕獲的異常時,確保事務被正確回滾。

2.2 攔截與執行流程

  1. 方法調用前:
  • 事務屬性解析: TransactionInterceptor 首先通過TransactionAttributeSource(通常是AnnotationTransactionAttributeSource)獲取目標方法的事務屬性。
  • 事務開始: 根據解析出的事務屬性,決定是否創建新的事務或者加入到當前事務中。如果需要新事務,它會通過事務管理器(如 PlatformTransactionManager 的實現類)來開始事務。
  1. 方法執行:
  • 在事務上下文中執行實際的目標方法。此時,如果目標方法內部拋出了異常,這個異常會被暫存以供后續處理。rW928資訊網——每日最新資訊28at.com

  1. rW928資訊網——每日最新資訊28at.com

    方法調用后:rW928資訊網——每日最新資訊28at.com

    rW928資訊網——每日最新資訊28at.com

  • 異常處理: 如果方法執行過程中拋出了異常,TransactionInterceptor 會捕獲到這個異常,并根據異常類型及事務屬性決定是否需要回滾事務。通常,非檢查型異常(繼承自 RuntimeException 的異常)會導致事務回滾,而檢查型異常則不會,除非事務屬性特別指定了回滾規則。rW928資訊網——每日最新資訊28at.com

  • 事務提交或回滾: 如果方法正常結束,或者按事務屬性應該提交事務的情況下,事務管理器會提交事務。相反,如果需要回滾,則執行回滾操作。rW928資訊網——每日最新資訊28at.com

  1. rW928資訊網——每日最新資訊28at.com

    資源清理: 在事務結束后,確保所有資源被正確釋放,比如關閉數據庫連接等。rW928資訊網——每日最新資訊28at.com

    rW928資訊網——每日最新資訊28at.com

2.3 動態代理的作用

整個過程中,動態代理扮演著關鍵角色。無論是 JDK 動態代理還是 CGLIB 代理,它們都是在調用真正業務方法之前插入事務攔截邏輯的橋梁。當客戶端代碼調用代理對象上的方法時,實際上是調用了由 TransactionInterceptor 所控制的代理邏輯,從而透明地在業務邏輯執行前后管理事務。rW928資訊網——每日最新資訊28at.com

通過這種方式,開發者無需在每個需要事務管理的方法中手動編寫開啟、提交或回滾事務的代碼,極大地簡化了開發復雜度,提高了代碼的可維護性和可讀性。rW928資訊網——每日最新資訊28at.com

三 多線程環境下的挑戰

當 @Transactional 標記的方法內部啟動新的線程時,問題就顯現了。前面提到,事務攔截使用了 TransactionInterceptor,而 TransactionInterceptor 內部用到了  TransactionSynchronizationManager,TransactionSynchronizationManager 使用 ThreadLocal 來存儲事務相關的資源信息,如數據庫連接、JMS 會話等。這意味著每個線程都有其獨立的事務上下文,確保了事務信息在線程間的隔離。rW928資訊網——每日最新資訊28at.com

換句話說,Spring 管理的事務上下文是基于調用線程的,新線程并沒有繼承原線程的 TransactionSynchronizationManager 中的事務上下文。因此,新線程執行的數據庫操作實際上是在無事務管理的環境下進行的,這就導致事務失效。rW928資訊網——每日最新資訊28at.com

那如果非要用多線程怎么辦呢?這個時候可以使用編程式事務,首先設置一個全局變量 Boolean,默認是可以提交的 true,在子線程,通過編程式事務的方式去開啟事務,然后插入數據,插入完成后,事務先不提交,同時通知主線程,我準備好了,進入等待狀態。如果子線程出現異常,那就通知主線程,我這邊發生異常,然后自己回滾。rW928資訊網——每日最新資訊28at.com

最后主線程收集各個子線程的狀態,如果有一個線程出現問題,那么全局變量就設置為不可提交false,然后喚醒所有子線程,進行回滾。rW928資訊網——每日最新資訊28at.com

這里涉及到線程同步可以利用閉鎖去實現;當主線程通知各個子線程提交事務的時候,子線程可能在提交的時候出錯了,最終導致數據不一致,那么這種時候可能就需要引入重試機制,有了重試機制后,又要去保證冪等性等等。rW928資訊網——每日最新資訊28at.com

這一套方案下來大伙有沒有覺得眼熟,是不是就是分布式事務的處理思路了?rW928資訊網——每日最新資訊28at.com

所以說,非要在事務中開啟多線程也沒問題,但是不建議這么做。rW928資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-93354-0.html事務中存在多線程,怎么處理?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 基于 Python 的人臉檢測 :人臉識別的前提

下一篇: Fiddler:一個大名鼎鼎的私藏工具

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久成人人人人精品欧| 亚洲国产一区在线| 欧美系列电影免费观看| 国产精品久久久久久久久免费樱桃| 国产精品久久精品日日| 国产小视频国产精品| 在线不卡视频| 亚洲午夜电影网| 久久久亚洲人| 欧美日韩成人一区| 国产主播一区二区三区四区| 亚洲精品久久久久久久久久久久 | 国产亚洲一级高清| 91久久精品一区| 午夜日韩电影| 欧美韩国在线| 国产欧美一区二区三区久久| 亚洲精品视频免费| 欧美亚洲综合久久| 欧美日韩国产黄| 黄色av日韩| 亚洲在线播放| 欧美成人精品三级在线观看| 国产伦精品一区二区三区高清版| 亚洲国产精品传媒在线观看| 香港久久久电影| 欧美日韩国内自拍| 在线观看91精品国产麻豆| 亚洲午夜久久久久久久久电影院| 玖玖综合伊人| 国产老肥熟一区二区三区| 亚洲日本欧美| 久久久999| 国产精品裸体一区二区三区| 亚洲日本欧美天堂| 久久九九有精品国产23| 国产精品美女久久| 亚洲美洲欧洲综合国产一区| 久久色在线观看| 国产欧美日韩精品丝袜高跟鞋| 亚洲精选91| 久久综合伊人77777麻豆| 国产精品嫩草影院av蜜臀| 亚洲精品小视频| 老司机精品久久| 国产精品视频免费| 一区二区日韩| 欧美国产激情二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲欧美日韩精品久久| 欧美日韩一区在线播放| 亚洲欧洲一区二区三区在线观看| 久久久久国产一区二区| 国产日韩欧美二区| 亚洲一区视频| 欧美日韩免费视频| 91久久精品美女高潮| 老司机免费视频一区二区| 国产一区二区三区的电影 | 欧美精品福利在线| 亚洲国产日日夜夜| 免费成人在线观看视频| 激情综合色综合久久综合| 午夜视频久久久| 国产精品美女午夜av| 一区二区三区四区五区在线| 欧美激情一区二区在线| 亚洲国产日韩一级| 免费中文字幕日韩欧美| 在线看视频不卡| 久久一区二区精品| 黑丝一区二区| 久久久久久97三级| 激情欧美一区二区| 久久久夜夜夜| 一区二区三区在线观看欧美| 久久久久久香蕉网| 黄色一区二区三区| 久久亚洲综合网| 亚洲成人原创| 欧美成人精品在线观看| 亚洲欧洲精品一区二区三区波多野1战4| 久久综合免费视频影院| 1769国内精品视频在线播放| 美女爽到呻吟久久久久| 亚洲国产精品久久久久| 欧美成人精品高清在线播放| 亚洲欧洲一区二区三区| 欧美激情综合| 亚洲桃花岛网站| 国产精品裸体一区二区三区| 午夜伦欧美伦电影理论片| 国产农村妇女精品一区二区| 欧美在线免费视频| 影音先锋中文字幕一区| 欧美顶级少妇做爰| 一区二区三区日韩在线观看| 国产精品久久久久国产a级| 午夜精品婷婷| 国产真实乱偷精品视频免| 久久影院午夜论| 亚洲精品一区二区在线| 欧美日一区二区在线观看| 亚洲综合色自拍一区| 国产伊人精品| 欧美夫妇交换俱乐部在线观看| 日韩视频在线观看| 国产精品成人av性教育| 欧美一区免费视频| 亚洲福利视频一区二区| 欧美日韩三区| 欧美亚洲一区二区在线| 亚洲高清在线观看一区| 欧美日韩在线视频观看| 欧美一二三区在线观看| 在线日本成人| 欧美三日本三级三级在线播放| 午夜精品亚洲| 亚洲高清不卡| 国产精品久久久久9999| 久久精品理论片| 亚洲精品少妇| 国产欧美日韩亚洲精品| 美女脱光内衣内裤视频久久网站| 日韩亚洲一区二区| 国产日韩欧美电影在线观看| 免费中文日韩| 亚洲综合视频网| 在线欧美日韩| 国产精品激情| 麻豆乱码国产一区二区三区| 在线视频中文亚洲| 狠狠色狠狠色综合日日小说| 欧美日本韩国一区二区三区| 性欧美videos另类喷潮| 亚洲欧洲日本国产| 国产欧美日韩视频在线观看| 欧美激情综合五月色丁香| 香蕉久久夜色精品国产使用方法| 亚洲国产精品t66y| 国产欧美一区二区三区视频| 欧美精品导航| 久久精品视频亚洲| 中国女人久久久| 在线精品亚洲| 国产乱码精品一区二区三区av| 欧美电影资源| 久久av一区二区三区亚洲| 日韩图片一区| 尤物99国产成人精品视频| 国产精品久久久久久亚洲毛片| 免费高清在线一区| 欧美亚洲一区在线| 亚洲深夜福利视频| 亚洲国产精品女人久久久| 国产伦精品一区二区三区高清版| 欧美国产日韩在线| 久久大逼视频| 亚洲一二三四久久| 亚洲精品国久久99热| 好吊色欧美一区二区三区视频| 国产精品福利在线观看| 欧美国产日韩在线| 久久―日本道色综合久久| 香蕉成人啪国产精品视频综合网| 亚洲免费观看高清完整版在线观看| 国内自拍视频一区二区三区| 国产精品免费看| 欧美日韩国产色视频| 蜜月aⅴ免费一区二区三区| 欧美在线一区二区| 亚洲一级片在线观看| 亚洲精品一区二区三区樱花| 国内精品伊人久久久久av影院| 国产精品久久久久久久久久久久久久 | 欧美国产一区在线| 噜噜噜噜噜久久久久久91| 欧美在现视频| 午夜精品成人在线视频| 一区二区成人精品| 亚洲精品一区二区三| 亚洲大胆视频| 一区二区三区我不卡| 国产一区二区三区黄| 国产精品中文字幕在线观看| 国产精品videossex久久发布| 欧美激情a∨在线视频播放| 麻豆精品国产91久久久久久| 久久久精品性| 久久九九99视频| 久久aⅴ国产紧身牛仔裤| 午夜日韩福利| 性色av香蕉一区二区| 亚洲欧美色一区| 亚洲综合首页| 午夜精品一区二区三区在线播放| 亚洲一级在线| 亚洲一区在线直播| 亚洲自拍另类| 午夜激情综合网| 午夜精品国产精品大乳美女| 亚洲欧美国产精品va在线观看| 亚洲一区二区三区影院| 亚洲一区二区三区四区五区午夜|