亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

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

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

編程式事務(wù)管理

使用PlatformTransactionManager

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

使用TransactionTemplate

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

在這里插入圖片描述

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

在這里插入圖片描述

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

聲明式事務(wù)管理

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

使用@Transactional注解

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

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

在這里插入圖片描述

源碼解析

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

ProxyTransactionManagementConfiguration

在這里插入圖片描述

TransactionInterceptor#invoke

在這里插入圖片描述

TransactionAspectSupport#invokeWithinTransaction

在這里插入圖片描述

TransactionAspectSupport#createTransactionIfNecessary

在這里插入圖片描述

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

AbstractPlatformTransactionManager#getTransaction

在這里插入圖片描述

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

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

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

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

  • REQUIRES_NEW :創(chuàng)建一個(gè)新事務(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)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)執(zhí)行 。如果當(dāng)前沒(méi)有事務(wù),則該取值等價(jià)于REQUIRED

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

參考博客

http://chabaoo.cn/article/229456.htm

總結(jié)

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

相關(guān)文章

  • Mybatis-Plus3.x的創(chuàng)建步驟及使用教程

    Mybatis-Plus3.x的創(chuàng)建步驟及使用教程

    MyBatis-Plus是一個(gè)?MyBatis?的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為?簡(jiǎn)化開(kāi)發(fā)、提高效率而生,這篇文章主要介紹了Mybatis-Plus3.x的使用,需要的朋友可以參考下
    2023-10-10
  • SpringMVC空指針異常NullPointerException解決及原理解析

    SpringMVC空指針異常NullPointerException解決及原理解析

    這篇文章主要介紹了SpringMVC空指針異常NullPointerException解決及原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java 二分查找算法的實(shí)現(xiàn)

    Java 二分查找算法的實(shí)現(xiàn)

    這篇文章主要介紹了Java 如何實(shí)現(xiàn)二分查找算法,幫助大家更好的理解和學(xué)習(xí)Java 算法,感興趣的朋友可以了解下
    2020-09-09
  • JVM實(shí)戰(zhàn)系列之CPU100%和內(nèi)存100%排查

    JVM實(shí)戰(zhàn)系列之CPU100%和內(nèi)存100%排查

    本文主要介紹了JVM實(shí)戰(zhàn)系列之CPU100%和內(nèi)存100%排查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java實(shí)現(xiàn)對(duì)象排序的兩種方式詳解

    Java實(shí)現(xiàn)對(duì)象排序的兩種方式詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)對(duì)象排序的兩種方式詳解,在Java中經(jīng)常會(huì)涉及到對(duì)象數(shù)組的排序問(wèn)題,則就提到對(duì)象之間的比較問(wèn)題,今天我們就來(lái)看一下兩種不同排序方式之間的區(qū)別,需要的朋友可以參考下
    2023-09-09
  • CompletableFuture并行處理List分批數(shù)據(jù)demo

    CompletableFuture并行處理List分批數(shù)據(jù)demo

    這篇文章主要介紹了CompletableFuture并行處理List分批數(shù)據(jù)實(shí)現(xiàn)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • java實(shí)現(xiàn)登錄案例

    java實(shí)現(xiàn)登錄案例

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)登錄案例的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • java實(shí)現(xiàn)文件編碼轉(zhuǎn)換的方法

    java實(shí)現(xiàn)文件編碼轉(zhuǎn)換的方法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件編碼轉(zhuǎn)換的方法,分享一個(gè)文件編碼轉(zhuǎn)換的工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Spring Boot 中常用的注解@RequestParam及基本用法

    Spring Boot 中常用的注解@RequestParam及基本用法

    @RequestParam 是 Spring Framework 和 Spring Boot 中常用的注解之一,用于從請(qǐng)求中獲取參數(shù)值,本文給大家介紹Spring Boot 中常用的注解@RequestParam,感興趣的朋友一起看看吧
    2023-10-10
  • Spring Boot攔截器實(shí)現(xiàn)步驟及測(cè)試實(shí)例

    Spring Boot攔截器實(shí)現(xiàn)步驟及測(cè)試實(shí)例

    這篇文章主要介紹了Spring Boot攔截器實(shí)現(xiàn)步驟及測(cè)試實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論