欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中的編程式事務(wù)和聲明式事務(wù)

 更新時(shí)間:2024年11月04日 09:25:44   作者:小喬努力變強(qiáng)  
Spring框架中,事務(wù)管理可以通過(guò)編程式事務(wù)和聲明式事務(wù)兩種方式實(shí)現(xiàn),編程式事務(wù)通過(guò)手動(dòng)編碼控制事務(wù)的開(kāi)始、提交和回滾,允許開(kāi)發(fā)者精確控制事務(wù),但增加了代碼復(fù)雜度,聲明式事務(wù)則通過(guò)@EnableTransactionManagement注解啟用事務(wù)管理

spring中控制事務(wù)的方式有兩種:編程式事務(wù)和聲明式事務(wù),今天我以?xún)煞N事務(wù)出發(fā),對(duì)spring中實(shí)現(xiàn)事務(wù)的@EnableTransactionManagement和@Transaction兩個(gè)注解的底層原理進(jìn)行討論。

一、編程式事務(wù)

什么是編程式事務(wù)?

硬編碼的方式實(shí)現(xiàn)事務(wù),在代碼中手動(dòng)開(kāi)始、提交和回滾事務(wù)

編程式事務(wù)實(shí)現(xiàn)思想是什么?

  • 配置PlatformTransactionManager事務(wù)管理器去控制事務(wù)
  • 配置TransactionDefinition設(shè)置事務(wù)屬性
  • 配置TransactionTemplate控制事務(wù)

步驟和原理

1、定義數(shù)據(jù)源

2、定義一個(gè)PlatformTransactionManager 事務(wù)管理器,指定數(shù)據(jù)源??刂剖聞?wù)的操作(開(kāi)始、提交、回滾)

3、定義TransactionDefinition 事務(wù)屬性,可以配置事務(wù)屬性信息

4、開(kāi)啟事務(wù)操作。通過(guò)調(diào)用getTransaction方法

補(bǔ)充:ThreadLocal中存儲(chǔ)了datasource和connection的映射

這樣當(dāng)我們開(kāi)啟事務(wù)的時(shí)候會(huì)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接,通過(guò)ThreadLocal保證線程的同步

5、執(zhí)行業(yè)務(wù)操作

6、commit提交/rollback回滾事務(wù)

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 以在代碼中精確地控制事務(wù)的起始點(diǎn)、提交點(diǎn)和回滾點(diǎn)
  • 實(shí)現(xiàn)更細(xì)粒度的事務(wù)管理

缺點(diǎn):

  • 代碼侵入性:編程式事務(wù)管理會(huì)將事務(wù)管理邏輯直接嵌入到業(yè)務(wù)代碼中,增加了代碼的復(fù)雜度和維護(hù)成本,使得業(yè)務(wù)邏輯與事務(wù)管理耦合在一起。
  • 重復(fù)性工作:在多個(gè)業(yè)務(wù)方法中可能需要重復(fù)編寫(xiě)事務(wù)管理邏輯,增加了代碼冗余和維護(hù)工作量。

二、聲明式事務(wù)

什么是聲明式事務(wù)?

通過(guò)配置的方式去管理事務(wù),可以是xml配置文件,也可以使用spring提供的@Transactional注解

聲明式事務(wù)實(shí)現(xiàn)思想是什么?

  • 添加@EnableTransactionManagement注解
  • 添加@Transactional注解

步驟和原理

1、啟用事務(wù)管理功能-配置類(lèi)上加上@EnableTransactionManagement注解

2、定義事務(wù)管理器

3、需要開(kāi)啟事務(wù)的目標(biāo)接口/類(lèi)/方法上添加@Transaction注解

4、執(zhí)行業(yè)務(wù)邏輯

5、啟動(dòng)spring容器,獲取bean執(zhí)行業(yè)務(wù)邏輯

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 與業(yè)務(wù)邏輯分離:聲明式事務(wù)管理將事務(wù)管理邏輯從業(yè)務(wù)代碼中分離出來(lái),使得業(yè)務(wù)邏輯更清晰,降低了代碼的耦合性。
  • 配置簡(jiǎn)單:通過(guò)注解或XML配置,可以簡(jiǎn)單地定義事務(wù)的傳播行為、隔離級(jí)別等屬性,而無(wú)需在每個(gè)業(yè)務(wù)方法中編寫(xiě)重復(fù)的事務(wù)管理代碼。
  • 易于維護(hù):由于事務(wù)管理邏輯集中在配置中,易于維護(hù)和修改,提高了代碼的可讀性和可維護(hù)性。
  • 提高一致性:聲明式事務(wù)管理可以確保在所有業(yè)務(wù)方法中都應(yīng)用相同的事務(wù)管理策略,提高了事務(wù)管理的一致性。

缺點(diǎn):

  • 靈活性有限:聲明式事務(wù)管理的靈活性相對(duì)較低,無(wú)法在運(yùn)行時(shí)動(dòng)態(tài)地改變事務(wù)管理策略,有一定的局限性。
  • RPC遠(yuǎn)程調(diào)用成功,但是本地事務(wù)回滾了,RPC調(diào)用無(wú)法回滾。并且事務(wù)中有遠(yuǎn)程調(diào)用,會(huì)拉長(zhǎng)整個(gè)事務(wù),導(dǎo)致本地事務(wù)的數(shù)據(jù)庫(kù)連接一致被占用,最后可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)連接池耗盡

在阿里巴巴的開(kāi)發(fā)手冊(cè)中也明確標(biāo)出,我們用@Transactional注解的時(shí)候要謹(jǐn)慎,大家在業(yè)務(wù)場(chǎng)景中要謹(jǐn)慎使用哦!

上面我已經(jīng)對(duì)spring實(shí)現(xiàn)事務(wù)的兩種方式分別進(jìn)行了說(shuō)明,下面我們看看它的源碼,解開(kāi)事務(wù)這個(gè)神秘面紗!

三、源碼分析

@EnableTransactionManagement

作用是什么?

開(kāi)啟spring自動(dòng)管理事務(wù)。在spring容器啟動(dòng)的時(shí)候,會(huì)攔截所有bean的創(chuàng)建,判斷當(dāng)前bean中有沒(méi)有用@Transaction注解,是不是需要讓spring管理事務(wù)

判斷規(guī)則:

  • public方法上有沒(méi)有用@Transaction注解和bean的類(lèi)相關(guān)的類(lèi)/接口上有沒(méi)有用@Transaction注解
  • 當(dāng)滿足規(guī)則之后會(huì)通過(guò)aop的方式創(chuàng)建代理,并且在代理中添加一個(gè)TransactionInterceptor攔截器

注意:@Transaction注解在代理對(duì)象被創(chuàng)建并且方法被調(diào)用時(shí)生效

@Transactional注解生效,必須確保Spring能夠?yàn)槟繕?biāo)類(lèi)創(chuàng)建代理對(duì)象,并且方法通過(guò)代理對(duì)象調(diào)用

TransactionInterceptor攔截器的作用是什么?

攔截@Transaction方法,在方法前后添加事務(wù)額外邏輯

如果代理中還有其他攔截器,攔截器的順序如何指定呢?

通過(guò)order()方法修改事務(wù)攔截器的執(zhí)行順序

注意:默認(rèn)值是 LOWEST_PRECEDENCE = Integer.MAX_VALUE,攔截器的執(zhí)行順序是order升序

 int order() default Ordered.LOWEST_PRECEDENCE;

@Import(TransactionManagementConfigurationSelector.class)在這里的作用是什么?

@Import的作用是批量導(dǎo)入需要注冊(cè)的類(lèi),完成bean的注冊(cè)

那@Import導(dǎo)入了哪些類(lèi)?

通過(guò)點(diǎn)進(jìn)去TransactionManagementConfigurationSelector我們發(fā)現(xiàn),里面有一個(gè)selectImports方法,這個(gè)方法的返回值是一個(gè)字符串?dāng)?shù)組,返回的字符串?dāng)?shù)組如果是正常的全限定類(lèi)名才會(huì)被容器識(shí)別

通過(guò)查看selectImports方法源碼,我們發(fā)現(xiàn)return了兩個(gè)類(lèi)-AutoProxyRegistrar、ProxyTransactionManageMentConfiguration,也就是說(shuō)Import導(dǎo)入了這兩個(gè)類(lèi)

  • AutoProxyRegistrar:?jiǎn)⒂胹pring aop功能,創(chuàng)建代理
  • ProxyTransactionManageMentConfiguration:在aop中添加事務(wù)攔截器

①、AutoProxyRegistrar

點(diǎn)進(jìn)源碼,我們看registerBeanDefinitions這個(gè)方法,看過(guò)spring容器啟動(dòng)流程的小伙伴會(huì)發(fā)現(xiàn),其中流程就會(huì)調(diào)用這個(gè)方法,AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry)作用是向spring容器注冊(cè)一個(gè)自動(dòng)代理創(chuàng)建器,從而啟用AOP代理的功能

在方法內(nèi)部會(huì)導(dǎo)入InfrastructureAdvisorAutoProxyCreator類(lèi),給spring 容器中注冊(cè)了一個(gè)后置處理器-BeanPostProcessor,攔截所有bean的創(chuàng)建并將符合規(guī)則的bean創(chuàng)建代理,對(duì)類(lèi)進(jìn)行增強(qiáng)

在生命周期階段,創(chuàng)建bean的時(shí)候只有需要增強(qiáng),就會(huì)調(diào)用BeanPostProcessor的after進(jìn)行增強(qiáng)

②、ProxyTransactionManageMentConfiguration

配置類(lèi),一般是提供加了@Bean的一些方法。注冊(cè)了一個(gè)事務(wù)攔截器TransactionInterceptor

總結(jié)

通過(guò)對(duì)上面兩個(gè)導(dǎo)入的類(lèi)的源碼分析我們明確了他們的作用,我們使用@Transaction標(biāo)注的bean會(huì)通過(guò)AutoProxyRegistrar去啟用aop功能,通過(guò)ProxyTransactionManagementConfiguration在aop中添加事務(wù)攔截器從而實(shí)現(xiàn)事務(wù)管理

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Jmeter測(cè)試時(shí)遇到的各種亂碼問(wèn)題及解決

    Jmeter測(cè)試時(shí)遇到的各種亂碼問(wèn)題及解決

    這篇文章主要介紹了Jmeter測(cè)試時(shí)遇到的各種亂碼問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 詳解Java實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之并查集

    詳解Java實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之并查集

    并查集這種數(shù)據(jù)結(jié)構(gòu),可能出現(xiàn)的頻率不是那么高,但是還會(huì)經(jīng)常性的見(jiàn)到,其理解學(xué)習(xí)起來(lái)非常容易,通過(guò)本文,一定能夠輕輕松松搞定并查集
    2021-06-06
  • 關(guān)于pom.xml中maven無(wú)法下載springcloud包問(wèn)題

    關(guān)于pom.xml中maven無(wú)法下載springcloud包問(wèn)題

    小編遇到這樣一個(gè)問(wèn)題spring-cloud-starter-feign,spring-cloud-starter-eureka 一直無(wú)法下載,maven倉(cāng)庫(kù)中包路徑顯示為unknown,怎么解決呢?下面小編給大家?guī)?lái)了pom.xml中maven無(wú)法下載springcloud包問(wèn)題,需要的朋友可以參考下
    2022-08-08
  • java Socket編程實(shí)現(xiàn)I/O多路復(fù)用的示例

    java Socket編程實(shí)現(xiàn)I/O多路復(fù)用的示例

    本文主要介紹了java Socket編程實(shí)現(xiàn)I/O多路復(fù)用的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Java自定義類(lèi)加載器實(shí)現(xiàn)類(lèi)隔離詳解

    Java自定義類(lèi)加載器實(shí)現(xiàn)類(lèi)隔離詳解

    由于每種組件的不同版本所依賴(lài)的jar包不同,我們可以借鑒tomcat的實(shí)現(xiàn)方式,通過(guò)自定義類(lèi)加載器打破雙親委派機(jī)制來(lái)實(shí)現(xiàn)類(lèi)隔離,從而達(dá)到操作多組件多版本的目的。本文就來(lái)和大家詳細(xì)聊聊實(shí)現(xiàn)方法
    2023-03-03
  • SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解

    SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解

    這篇文章主要介紹了SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解,SpringBoot框架中提供了2個(gè)注解來(lái)讓開(kāi)發(fā)者快速配置來(lái)實(shí)現(xiàn)單機(jī)定時(shí)任務(wù)調(diào)度的功能,分別是@EnableScheduling和 @Scheduled,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于java自定義線程池的原理與實(shí)現(xiàn)

    關(guān)于java自定義線程池的原理與實(shí)現(xiàn)

    本文介紹了如何自定義線程池和阻塞隊(duì)列,包括阻塞隊(duì)列的實(shí)現(xiàn)方法,線程池的構(gòu)建以及拒絕策略的應(yīng)用,詳細(xì)闡述了線程池中任務(wù)的提交和執(zhí)行流程,以及如何處理任務(wù)超出隊(duì)列容量的情況
    2022-04-04
  • 關(guān)于@GetMapping和@GetMapping(value=““)的區(qū)別

    關(guān)于@GetMapping和@GetMapping(value=““)的區(qū)別

    這篇文章主要介紹了關(guān)于@GetMapping和@GetMapping(value=““)的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • SpringBoot整合RocketMQ的方法詳解

    SpringBoot整合RocketMQ的方法詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot整合RocketMQ的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定幫助,感興趣的小伙伴可以了解一下
    2022-08-08
  • Springboot初始化項(xiàng)目并完成登入注冊(cè)的全過(guò)程

    Springboot初始化項(xiàng)目并完成登入注冊(cè)的全過(guò)程

    工作之余,想要學(xué)習(xí)一下SpringBoot,通過(guò)網(wǎng)絡(luò)大量教程最終成功運(yùn)行SpringBoot項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于Springboot初始化項(xiàng)目并完成登入注冊(cè)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10

最新評(píng)論