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

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

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

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

一、編程式事務(wù)

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

硬編碼的方式實現(xiàn)事務(wù),在代碼中手動開始、提交和回滾事務(wù)

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

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

步驟和原理

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

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

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

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

補充:ThreadLocal中存儲了datasource和connection的映射

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

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

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

優(yōu)缺點

優(yōu)點:

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

缺點:

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

二、聲明式事務(wù)

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

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

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

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

步驟和原理

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

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

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

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

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

優(yōu)缺點

優(yōu)點:

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

缺點:

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

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

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

三、源碼分析

@EnableTransactionManagement

作用是什么?

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

判斷規(guī)則:

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

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

@Transactional注解生效,必須確保Spring能夠為目標(biāo)類創(chuàng)建代理對象,并且方法通過代理對象調(diào)用

TransactionInterceptor攔截器的作用是什么?

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

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

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

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

 int order() default Ordered.LOWEST_PRECEDENCE;

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

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

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

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

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

  • AutoProxyRegistrar:啟用spring aop功能,創(chuàng)建代理
  • ProxyTransactionManageMentConfiguration:在aop中添加事務(wù)攔截器

①、AutoProxyRegistrar

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

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

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

②、ProxyTransactionManageMentConfiguration

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

總結(jié)

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

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

相關(guān)文章

  • Java文件操作工具類fileUtil實例【文件增刪改,復(fù)制等】

    Java文件操作工具類fileUtil實例【文件增刪改,復(fù)制等】

    這篇文章主要介紹了Java文件操作工具類fileUtil,結(jié)合實例形式分析了java針對文件進(jìn)行讀取、增加、刪除、修改、復(fù)制等操作的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-10-10
  • Java實現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法

    Java實現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法

    這篇文章主要介紹了Java實現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法,方法通過實例代碼給大家介紹的非常詳細(xì),選擇使用哪種格式通常取決于項目的需求和上下文,所以格式轉(zhuǎn)換就成了我們必備的技能,具體實現(xiàn)代碼跟隨小編一起看看吧
    2023-10-10
  • 詳解Java序列化如何破壞單例模式

    詳解Java序列化如何破壞單例模式

    這篇文章主要為大家詳細(xì)介紹了Java序列化是如何破壞單例模式的,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • Java8的Lambda遍歷兩個List匹配數(shù)據(jù)方式

    Java8的Lambda遍歷兩個List匹配數(shù)據(jù)方式

    這篇文章主要介紹了Java8的Lambda遍歷兩個List匹配數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • JavaWeb 入門:Hello Servlet

    JavaWeb 入門:Hello Servlet

    這篇文章主要介紹了Servlet開發(fā)JavaWeb工程示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Nacos集群數(shù)據(jù)同步方式

    Nacos集群數(shù)據(jù)同步方式

    文章主要介紹了Nacos集群中服務(wù)注冊信息的同步機制,涉及到負(fù)責(zé)節(jié)點和非負(fù)責(zé)節(jié)點之間的數(shù)據(jù)同步過程,以及DistroProtocol協(xié)議在同步中的應(yīng)用
    2024-12-12
  • java判斷字符串是否為數(shù)字的方法小結(jié)

    java判斷字符串是否為數(shù)字的方法小結(jié)

    這篇文章主要介紹了java判斷字符串是否為數(shù)字的方法,分別講述了使用Java自帶函數(shù)、正則表達(dá)式及ascii碼三種方法進(jìn)行字符串判斷的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案

    SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案

    這篇文章主要介紹了SpringCloud Feign轉(zhuǎn)發(fā)請求頭(防止session失效)的解決方案,本文給大家分享兩種解決方案供大家參考,感興趣的朋友跟隨小編一起看看吧
    2020-10-10
  • Java中泛型的接口、通配符使用詳解

    Java中泛型的接口、通配符使用詳解

    這篇文章主要介紹了Java中泛型的接口、通配符使用詳解,編譯時的類型安全監(jiān)測機制,也可以把這個數(shù)據(jù)類型理解成是一種可以傳遞的參數(shù),需要的朋友可以參考下
    2023-08-08
  • 如何解決TCP?socket的阻塞問題

    如何解決TCP?socket的阻塞問題

    這篇文章主要介紹了如何解決TCP?socket的阻塞問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論

霍林郭勒市| 温宿县| 和林格尔县| 泰兴市| 沁源县| 淅川县| 孟村| 洞头县| 腾冲县| 房产| 库尔勒市| 洞口县| 马关县| 兴国县| 新竹县| 绍兴市| 光山县| 米林县| 伊宁县| 德惠市| 德安县| 辰溪县| 哈密市| 元阳县| 台安县| 云南省| 元谋县| 孙吴县| 涞水县| 麦盖提县| 衡南县| 洱源县| 洛川县| 泗阳县| 赫章县| 竹山县| 莆田市| 和静县| 驻马店市| 华安县| 视频|