中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java?Spring?AOP源碼解析中的事務實現原理是什么

發布時間:2022-01-05 14:03:16 來源:億速云 閱讀:141 作者:柒染 欄目:開發技術

這篇文章將為大家詳細講解有關Java Spring AOP源碼解析中的事務實現原理是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

不用Spring管理事務?

讓我們先來看一下不用spring管理事務時,各種框架是如何管理事務的

使用JDBC來管理事務

Java?Spring?AOP源碼解析中的事務實現原理是什么

使用Hibernate來管理事務

Java?Spring?AOP源碼解析中的事務實現原理是什么

業務邏輯和事務代碼是耦合到一塊的,并且和框架的具體api綁定了。當我們換一種框架來實現時,里面對事務控制的代碼就要推倒重寫,并不一定能保證替換后的api和之前的api有相同的行為。

基于這些問題,Spring抽象了一些事務相關的頂層接口,我們面向接口編程,換框架時只要換具體的實現即可。有點像JDBC API的味道了

Java?Spring?AOP源碼解析中的事務實現原理是什么

常用api接口
PlatformTransactionManager對事務進行管理
TransactionDefinition定義事務的相關屬性,例如隔離級別,傳播行為
TransactionStatus保存事務狀態

針對不同的數據訪問技術,使用不用的PlatformTransactionManager類即可

數據訪問技術PlatformTransactionManager實現類
JDBC/MybatisDataSourceTransactionManager
HibernateHibernateTransactionManager
JpaJpaTransactionManager
JmsJmsTransactionManager

編程式事務管理

使用PlatformTransactionManager

Java?Spring?AOP源碼解析中的事務實現原理是什么

Java?Spring?AOP源碼解析中的事務實現原理是什么

Java?Spring?AOP源碼解析中的事務實現原理是什么

使用TransactionTemplate

當我們直接使用PlatformTransactionManager來管理事務時,有很多模版代碼。例如業務代碼正常執行,提交事務,否則回滾事務。我們可以把這部分模版代碼封裝成一個模版類,這樣使用起來就很方便了,如下所示

Java?Spring?AOP源碼解析中的事務實現原理是什么

如下圖所示,TransactionTemplate#execute方法就是一個典型的模版方法

Java?Spring?AOP源碼解析中的事務實現原理是什么

我們可以傳入如下2個接口的實現類來執行業務邏輯,TransactionCallback(需要返回執行結果)或TransactionCallbackWithoutResult(不需要返回結果)

聲明式事務管理

為了讓使用更加簡潔,Spring直接把事務代碼的執行放到切面中了,我們只需要在業務代碼方法上加上一個@Transactional注解即可,這種方式我們最常用哈

使用@Transactional注解

此時事務相關的定義我們就可以通過@Transactional注解來設置了

屬性名類型描述默認值
value(和transactionManager互為別名)String當在配置文件中有多個PlatformTransactionManager ,用該屬性指定選擇哪個事務管理器空字符串""
propagation枚舉:Propagation事務的傳播行為REQUIRED
isolation枚舉:Isolation事務的隔離度DEFAULT
timeoutint事務的超時時間。如果超過該時間限制但事務還沒有完成,則自動回滾事務-1
readOnlyboolean指定事務是否為只讀事務false
rollbackForClass[]需要回滾的異常空數組{}
rollbackForClassNameString[]需要回滾的異常類名空數組{}
noRollbackForClass[]不需要回滾的異常空數組{}
noRollbackForClassNameString[]不需要回滾的異常類名空數組{}

Java?Spring?AOP源碼解析中的事務實現原理是什么

源碼解析

我們需要在配置類上加上@EnableTransactionManagement注解,來開啟spring事務管理功能,@EnableTransactionManagement最主要的功能就是注入一個TransactionInterceptor攔截器,來控制事務開啟,提交或者回滾

ProxyTransactionManagementConfiguration

Java?Spring?AOP源碼解析中的事務實現原理是什么

TransactionInterceptor#invoke

Java?Spring?AOP源碼解析中的事務實現原理是什么

TransactionAspectSupport#invokeWithinTransaction

Java?Spring?AOP源碼解析中的事務實現原理是什么

TransactionAspectSupport#createTransactionIfNecessary

Java?Spring?AOP源碼解析中的事務實現原理是什么

當開啟事務的時候,可以看到各種傳播屬性的行為

AbstractPlatformTransactionManager#getTransaction

Java?Spring?AOP源碼解析中的事務實現原理是什么

Spring事務的傳播行為在Propagation枚舉類中定義了如下幾種選擇

支持當前事務

  • REQUIRED :如果當前存在事務,則加入該事務。如果當前沒有事務,則創建一個新的事務

  • SUPPORTS:如果當前存在事務,則加入該事務 。如果當前沒有事務, 則以非事務的方式繼續運行

  • MANDATORY :如果當前存在事務,則加入該事務 。如果當前沒有事務,則拋出異常

不支持當前事務

  • REQUIRES_NEW :創建一個新事務,如果當前存在事務,則把當前事務掛起

  • NOT_SUPPORTED : 以非事務方式運行,如果當前存在事務,則把當前事務掛起

  • NEVER : 以非事務方式運行,如果當前存在事務,則拋出異常

其他情況

  • NESTED :如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來執行 。如果當前沒有事務,則該取值等價于REQUIRED

以NESTED啟動的事務內嵌于外部事務中 (如果存在外部事務的話),此時內嵌事務并不是一個獨立的事務,它依賴于外部事務。只有通過外部事務的提交,才能引起內部事務的提交,嵌套的子事務不能單獨提交

關于Java Spring AOP源碼解析中的事務實現原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滦南县| 四会市| 虎林市| 靖西县| 定边县| 鹤庆县| 公安县| 当涂县| 太仓市| 旬阳县| 黎川县| 榕江县| 烟台市| 内江市| 阿巴嘎旗| 广南县| 高平市| 隆回县| 延长县| 巴彦淖尔市| 安西县| 铅山县| 黑河市| 寻乌县| 蒙山县| 天门市| 德化县| 林西县| 汉沽区| 泊头市| 越西县| 岑溪市| 林州市| 清水河县| 通州区| 屏东市| 湘潭县| 凤城市| 申扎县| 梅河口市| 秦安县|