最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?Spring?AOP源碼解析之事務(wù)實現(xiàn)原理

 更新時間:2022年01月07日 15:06:42   作者:Java識堂  
這篇文章主要為大家介紹了Java?Spring?AOP事務(wù)實現(xiàn)原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

不用Spring管理事務(wù)?

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

使用JDBC來管理事務(wù)

在這里插入圖片描述

使用Hibernate來管理事務(wù)

在這里插入圖片描述

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

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

在這里插入圖片描述

常用api接口
PlatformTransactionManager對事務(wù)進(jìn)行管理
TransactionDefinition定義事務(wù)的相關(guān)屬性,例如隔離級別,傳播行為
TransactionStatus保存事務(wù)狀態(tài)

針對不同的數(shù)據(jù)訪問技術(shù),使用不用的PlatformTransactionManager類即可

數(shù)據(jù)訪問技術(shù)PlatformTransactionManager實現(xiàn)類
JDBC/MybatisDataSourceTransactionManager
HibernateHibernateTransactionManager
JpaJpaTransactionManager
JmsJmsTransactionManager

編程式事務(wù)管理

使用PlatformTransactionManager

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

使用TransactionTemplate

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

在這里插入圖片描述

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

在這里插入圖片描述

我們可以傳入如下2個接口的實現(xiàn)類來執(zhí)行業(yè)務(wù)邏輯,TransactionCallback(需要返回執(zhí)行結(jié)果)或TransactionCallbackWithoutResult(不需要返回結(jié)果)

聲明式事務(wù)管理

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

使用@Transactional注解

此時事務(wù)相關(guān)的定義我們就可以通過@Transactional注解來設(shè)置了

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

在這里插入圖片描述

源碼解析

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

ProxyTransactionManagementConfiguration

在這里插入圖片描述

TransactionInterceptor#invoke

在這里插入圖片描述

TransactionAspectSupport#invokeWithinTransaction

在這里插入圖片描述

TransactionAspectSupport#createTransactionIfNecessary

在這里插入圖片描述

當(dāng)開啟事務(wù)的時候,可以看到各種傳播屬性的行為

AbstractPlatformTransactionManager#getTransaction

在這里插入圖片描述

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

支持當(dāng)前事務(wù)

  • REQUIRED :如果當(dāng)前存在事務(wù),則加入該事務(wù)。如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù)
  • SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù) 。如果當(dāng)前沒有事務(wù), 則以非事務(wù)的方式繼續(xù)運(yùn)行
  • MANDATORY :如果當(dāng)前存在事務(wù),則加入該事務(wù) 。如果當(dāng)前沒有事務(wù),則拋出異常

不支持當(dāng)前事務(wù)

  • REQUIRES_NEW :創(chuàng)建一個新事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起
  • NOT_SUPPORTED : 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起
  • NEVER : 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常

其他情況

  • NESTED :如果當(dāng)前存在事務(wù),則創(chuàng)建一個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來執(zhí)行 。如果當(dāng)前沒有事務(wù),則該取值等價于REQUIRED

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

參考博客

http://www.fzitv.net/article/229456.htm

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 詳解Java語言中的抽象類與繼承

    詳解Java語言中的抽象類與繼承

    這篇文章主要為大家詳細(xì)介紹了Java語言中的抽象類與繼承的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,感興趣的小伙伴快跟隨小編一起了解一下
    2022-10-10
  • 淺談Java實體對象的三種狀態(tài)以及轉(zhuǎn)換關(guān)系

    淺談Java實體對象的三種狀態(tài)以及轉(zhuǎn)換關(guān)系

    這篇文章主要介紹了淺談Java實體對象的三種狀態(tài)以及轉(zhuǎn)換關(guān)系,具有一定參考價值,需要的朋友可以,看看。。
    2017-11-11
  • javaWeb實現(xiàn)學(xué)生信息管理系統(tǒng)

    javaWeb實現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了javaWeb實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Spring Security OAuth 個性化token的使用

    Spring Security OAuth 個性化token的使用

    這篇文章主要介紹了Spring Security OAuth 個性化token的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • 在項目中集成jetty server步驟解析

    在項目中集成jetty server步驟解析

    這篇文章主要介紹了在項目中集成jetty server步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Java 8 中 Map 騷操作之 merge() 的使用方法

    Java 8 中 Map 騷操作之 merge() 的使用方法

    本文簡單介紹了一下Map.merge()的方法,除此之外,Java 8 中的HashMap實現(xiàn)方法使用了TreeNode和 紅黑樹,原理很相似,今天通過本文給大家介紹Java 8 中 Map 騷操作之 merge() 的用法 ,需要的朋友參考下吧
    2021-07-07
  • JAVA?ServLet創(chuàng)建一個項目的基本步驟

    JAVA?ServLet創(chuàng)建一個項目的基本步驟

    Servlet是Server Applet的簡稱,是運(yùn)行在服務(wù)器上的小程序,用于編寫Java的服務(wù)器端程序,它的主要作用是接收并響應(yīng)來自Web客戶端的請求,下面這篇文章主要給大家介紹了關(guān)于JAVA?ServLet創(chuàng)建一個項目的基本步驟,需要的朋友可以參考下
    2024-03-03
  • Java語言多線程終止中的守護(hù)線程實例

    Java語言多線程終止中的守護(hù)線程實例

    這篇文章主要介紹了Java語言多線程終止中的守護(hù)線程實例,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • IDEA配置java開發(fā)環(huán)境(maven、gradle、tomcat)

    IDEA配置java開發(fā)環(huán)境(maven、gradle、tomcat)

    這篇文章主要介紹了IDEA配置java開發(fā)環(huán)境(maven、gradle、tomcat),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring6?的JdbcTemplate的JDBC模板類的使用介紹(最新推薦)

    Spring6?的JdbcTemplate的JDBC模板類的使用介紹(最新推薦)

    JdbcTemplate?是Spring?提供的一個JDBC模板類,是對JDBC的封裝,簡化JDBC代碼,當(dāng)然,你也可以不用,可以讓Spring集成其它的ORM框架,這篇文章主要介紹了Spring6?的JdbcTemplate的JDBC模板類的詳細(xì)使用說明,需要的朋友可以參考下
    2024-05-05

最新評論

海盐县| 民权县| 威远县| 陇川县| 静安区| 屏东市| 仪征市| 清水河县| 习水县| 方正县| 阜康市| 北京市| 嘉峪关市| 游戏| 札达县| 凯里市| 瑞金市| 永清县| 宜昌市| 尤溪县| 徐水县| 赫章县| 龙井市| 漾濞| 襄城县| 梅州市| 泸定县| 将乐县| 江阴市| 灌南县| 荔波县| 峡江县| 彭山县| 灯塔市| 长沙市| 奎屯市| 兴化市| 罗城| 安徽省| 孙吴县| 鲁山县|