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

Spring的兩種事務(wù)管理機(jī)制的基本概念和demo示例

 更新時(shí)間:2023年07月17日 10:36:55   作者:小威要向諸佬學(xué)習(xí)呀  
Spring事務(wù)包括聲明式事務(wù)管理和注解式事務(wù)管理,我們通過概念和小demo的形式一步一步地來一起學(xué)習(xí)這個(gè)知識(shí)點(diǎn),需要的朋友可以參考下

聲明式事務(wù)管理

首先簡單介紹下Spring的聲明式事務(wù)管理:

聲明式事務(wù)管理是指通過配置來實(shí)現(xiàn)事務(wù)管理,我們只需定義事務(wù)邊界和事務(wù)屬性,不需要顯式編寫事務(wù)管理的代碼。

那么我們?nèi)绾螌?shí)現(xiàn)呢?

首先配置事務(wù)管理器和數(shù)據(jù)源:通過配置 <bean> 元素,使用 TransactionManager 類型的 Bean 來提供事務(wù)管理器的實(shí)例,并使用 DataSource 類型的 Bean 來提供數(shù)據(jù)源。

接著定義事務(wù)邊界:使用 <tx:advice> 元素來定義事務(wù)邊界和事務(wù)屬性,指定哪些方法需要進(jìn)行事務(wù)管理。

還需要配置事務(wù)通知:使用 <aop:config> 元素來啟用事務(wù)管理功能并將事務(wù)通知應(yīng)用到指定的切入點(diǎn)上。

注解式管理事務(wù)

除了上面提到的聲明式管理之外,Spring提供了一種更加簡單且強(qiáng)大的方式來管理事務(wù),通過使用注解式事務(wù),可以在方法級(jí)別上進(jìn)行聲明和配置事務(wù)的行為。這塊面試官問的更多,我們來詳細(xì)介紹下:

@Transactional注解(核心注解): @Transactional是Spring中最常用的注解之一,用于標(biāo)識(shí)需要進(jìn)行事務(wù)管理的方法或類。它可以應(yīng)用在方法上或類上,而且還可以配置這些屬性:

  1. value:指定事務(wù)管理器的名稱(如果有多個(gè)事務(wù)管理器)。
  2. propagation:指定事務(wù)傳播行為,默認(rèn)值為REQUIRED。
  3. isolation:指定事務(wù)隔離級(jí)別,默認(rèn)值為DEFAULT。
  4. readOnly:指定事務(wù)是否為只讀事務(wù),默認(rèn)值為false。
  5. timeout:指定事務(wù)超時(shí)時(shí)間,默認(rèn)值為-1,表示不設(shè)置超時(shí)。

事務(wù)傳播行為

上面介紹了Spring實(shí)現(xiàn)事務(wù)的兩種方式,接下來介紹下另一個(gè)重量級(jí)的知識(shí)點(diǎn)–》事務(wù)傳播行為。

事務(wù)傳播行為定義了當(dāng)一個(gè)事務(wù)方法調(diào)用另一個(gè)事務(wù)方法時(shí),如何處理事務(wù)的范圍。Spring提供了多種傳播行為選項(xiàng),包括:

  1. REQUIRED:如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù);如果已存在事務(wù),則加入到當(dāng)前事務(wù)中。
  2. REQUIRES_NEW:每次都會(huì)創(chuàng)建一個(gè)新的事務(wù),如果已存在事務(wù)則將其掛起。
  3. SUPPORTS:如果當(dāng)前存在事務(wù),則加入到當(dāng)前事務(wù)中;如果沒有事務(wù),則以非事務(wù)方式執(zhí)行。
  4. NOT_SUPPORTED:以非事務(wù)方式執(zhí)行方法,如果當(dāng)前存在事務(wù)則將其掛起。
  5. NEVER:以非事務(wù)方式執(zhí)行方法,如果當(dāng)前存在事務(wù)則拋出異常。
  6. MANDATORY:如果當(dāng)前存在事務(wù),則加入到當(dāng)前事務(wù)中;如果沒有事務(wù),則拋出異常。
  7. NESTED:如果當(dāng)前存在事務(wù),則將該事務(wù)嵌套到當(dāng)前事務(wù)中作為一個(gè)保存點(diǎn),可以回滾到該保存點(diǎn)。

事務(wù)隔離級(jí)別

接下來介紹下 spring的事務(wù)隔離級(jí)別,這一塊也是面試官經(jīng)常問到的一點(diǎn)。它與數(shù)據(jù)庫的事務(wù)隔離級(jí)別有著異曲同工之妙。

事務(wù)隔離級(jí)別定義了多個(gè)事務(wù)同時(shí)運(yùn)行時(shí)彼此之間的可見性和影響范圍。Spring支持以下事務(wù)隔離級(jí)別:

  • DEFAULT:使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級(jí)別。
  • READ_UNCOMMITTED:最低級(jí)別的隔離級(jí)別,允許讀取未提交的數(shù)據(jù)。
  • READ_COMMITTED:允許讀取已提交的數(shù)據(jù)。
  • REPEATABLE_READ:對同一數(shù)據(jù)的多次讀取結(jié)果保持一致,避免臟讀和不可重復(fù)讀。
  • SERIALIZABLE:最高級(jí)別的隔離級(jí)別,確保事務(wù)串行執(zhí)行,避免任何并發(fā)問題。
  • 只讀事務(wù)(readOnly): 如果一個(gè)事務(wù)中的方法僅執(zhí)行讀操作而不進(jìn)行寫操作時(shí),可以將事務(wù)標(biāo)記為只讀事務(wù)。這樣做可以提高性能,因?yàn)橹蛔x事務(wù)不需要對數(shù)據(jù)進(jìn)行鎖定。

學(xué)生管理系統(tǒng)demo

如果上面的概念看著有點(diǎn)懵,那么接下來讓我們通過一個(gè)學(xué)生管理系統(tǒng)的demo來詳細(xì)介紹 Spring 的聲明式事務(wù)和基于注解的事務(wù)管理。

我從項(xiàng)目中扒出來部分偽代碼,現(xiàn)在我們有一個(gè)簡單的學(xué)生管理系統(tǒng),其中包含兩個(gè)服務(wù)方法:addStudent() 和 updateStudent()。addStudent() 方法用于添加學(xué)生信息,updateStudent() 方法用于更新學(xué)生信息。

使用聲明式事務(wù)管理demo

前面概念部分提到過,在聲明式事務(wù)管理中,我們可以使用 XML 配置來定義事務(wù)邊界和事務(wù)特性。

首先,我們需要配置事務(wù)管理器和數(shù)據(jù)源。在 Spring 配置文件中,我們可以使用 TransactionManager 元素和 DataSource 元素來配置相應(yīng)的 Bean。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <!-- 數(shù)據(jù)源配置 -->
</bean>

接下來,定義事務(wù)邊界,我們可以在服務(wù)類中使用 :

<bean id="studentService" class="com.test.StudentService">
    <!-- 依賴注入 -->
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED" />
        <tx:method name="update*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="studentServicePointcut" expression="execution(* com.example.StudentService.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="studentServicePointcut" />
</aop:config>

在上面的代碼中,我們使用了 <tx:advice> 元素來配置事務(wù)邊界。通過 <tx:method> 元素,我們可以指定需要進(jìn)行事務(wù)管理的方法并定義事務(wù)傳播行為。

最后,在 Spring 配置文件中,我們需要啟用事務(wù)管理功能并配置事務(wù)通知。

<tx:annotation-driven transaction-manager="transactionManager" />

我們配置了以上代碼,因此Spring 會(huì)自動(dòng)掃描帶有 @Transactional 注解的方法,并生成事務(wù)通知。

使用注解的事務(wù)管理demo

首先第一步也是配置事務(wù)管理器和數(shù)據(jù)源,這一步與聲明式事務(wù)管理相同,因此不在贅述。

接著定義事務(wù)邊界,這點(diǎn)與聲明式事務(wù)管理相比,基于注解的事務(wù)管理不再需要在 Spring 配置文件中進(jìn)行額外的配置。我們只需在服務(wù)類中使用 @Transactional 注解即可。

@Service
public class StudentService {
    // ...
    @Transactional
    public void addStudent(Student student) {
        // 添加學(xué)生信息,管理系統(tǒng)偽代碼省略
    }
    @Transactional
    public void updateStudent(Student student) {
        // 更新學(xué)生信息,管理系統(tǒng)偽代碼省略
    }
    // ...
}

通過添加 @Transactional 注解到服務(wù)類中的方法上,我們直接就實(shí)現(xiàn)了對 addStudent() 和 updateStudent() 方法的事務(wù)管理。

同時(shí),我們也可以將 @Transactional 注解應(yīng)用到接口定義或抽象類的方法上,以便在子類中繼承和覆蓋時(shí)繼續(xù)享受事務(wù)管理功能。

面試這樣答

聲明式事務(wù)管理和基于注解的事務(wù)管理是 Spring 提供的兩種常用事務(wù)管理方式。它們都能夠簡化事務(wù)管理的配置和編寫,并提供了靈活的事務(wù)特性。

在聲明式事務(wù)管理中,我們使用 XML 配置或注解來定義事務(wù)邊界和事務(wù)通知。通過使用 <tx:advice> 元素和 <tx:method> 元素,我們可以指定需要進(jìn)行事務(wù)管理的方法并定義事務(wù)傳播行為。

而基于注解的事務(wù)管理更加簡潔,只需在服務(wù)類的方法上添加 @Transactional 注解即可實(shí)現(xiàn)事務(wù)管理。

無論是哪種方式,Spring 的事務(wù)管理機(jī)制都使得我們能夠輕松實(shí)現(xiàn)數(shù)據(jù)的一致性和完整性。通過合理配置事務(wù)特性,我們可以滿足不同業(yè)務(wù)場景下的事務(wù)需求。

到此這篇關(guān)于Spring的兩種事務(wù)管理機(jī)制的基本概念和demo示例的文章就介紹到這了,更多相關(guān)Spring的兩種事務(wù)管理機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用System.exit()來優(yōu)雅地終止SpringBoot項(xiàng)目的代碼示例

    使用System.exit()來優(yōu)雅地終止SpringBoot項(xiàng)目的代碼示例

    System.exit() 方法是 Java 中用于退出程序的方法,它接受一個(gè)整數(shù)參數(shù),通常被用來指示程序的退出狀態(tài),本文給大家介紹了如何使用System.exit()來優(yōu)雅地終止SpringBoot項(xiàng)目,需要的朋友可以參考下
    2024-08-08
  • springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實(shí)現(xiàn)

    springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實(shí)現(xiàn)

    本文主要介紹了springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 解讀Map中的computeIfAbsent方法

    解讀Map中的computeIfAbsent方法

    文章介紹了Java 8中Map接口的computeIfAbsent方法,該方法用于在Map中獲取指定鍵的值,如果不存在則調(diào)用提供的函數(shù)計(jì)算值并放入Map中,并給出了使用示例
    2026-05-05
  • 詳解HttpSecurity是如何組裝過濾器鏈的

    詳解HttpSecurity是如何組裝過濾器鏈的

    HttpSecurity 本質(zhì)上也是一個(gè) SecurityBuilder,我們平時(shí)在 HttpSecurity 配置的各種東西,本質(zhì)上其實(shí)就是一個(gè) xxxConfigure,這些 xxxConfigure 被 HttpSecurity 收集起來,本文將給大家介紹HttpSecurity是如何組裝過濾器鏈的,需要的朋友可以參考下
    2024-06-06
  • 如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息

    如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息

    這篇文章主要介紹了如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Springboot自動(dòng)裝配之注入DispatcherServlet的實(shí)現(xiàn)方法

    Springboot自動(dòng)裝配之注入DispatcherServlet的實(shí)現(xiàn)方法

    這篇文章主要介紹了Springboot自動(dòng)裝配之注入DispatcherServlet,Springboot向外界提供web服務(wù),底層依賴了springframework中的web模塊來實(shí)現(xiàn),那么springboot在什么時(shí)機(jī)向容器注入DispatcherServlet這個(gè)核心類的呢?帶著這個(gè)問題一起通過本文學(xué)習(xí)吧
    2022-05-05
  • Springboot之Jasypt配置文件加密/解密方式

    Springboot之Jasypt配置文件加密/解密方式

    Jasypt是一個(gè)用于Java項(xiàng)目加密敏感信息的庫,可以避免敏感信息泄露,文章介紹了如何在Spring Boot項(xiàng)目中整合Jasypt,并提供了一些防止密碼泄露的建議
    2026-03-03
  • MyBatis-Plus 分頁插件配置的兩種方式實(shí)現(xiàn)

    MyBatis-Plus 分頁插件配置的兩種方式實(shí)現(xiàn)

    本文主要介紹了MyBatis-Plus 分頁插件配置的兩種方式實(shí)現(xiàn),包括使用PaginationInterceptor和MybatisPlusInterceptor兩種方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • java中queue接口的使用詳解

    java中queue接口的使用詳解

    本篇文章主要介紹了java中queue接口的使用詳解,對學(xué)習(xí)Queue接口有一定的幫助,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • Java鏈表(Linked List)基本原理與實(shí)現(xiàn)方法入門示例

    Java鏈表(Linked List)基本原理與實(shí)現(xiàn)方法入門示例

    這篇文章主要介紹了Java鏈表(Linked List)基本原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Java鏈表(Linked List)的功能、原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03

最新評(píng)論

湖口县| 肇源县| 杭锦后旗| 德庆县| 巴楚县| 舟山市| 金寨县| 鹿泉市| 汕头市| 大理市| 根河市| 梁河县| 咸阳市| 松江区| 南漳县| 当阳市| 宜良县| 武宣县| 辰溪县| 秭归县| 上饶市| 德惠市| 福海县| 库车县| 瑞丽市| 鹰潭市| 运城市| 中江县| 获嘉县| 吉林省| 阜康市| 黄冈市| 西吉县| 湖州市| 剑川县| 马鞍山市| 元江| 连城县| 米易县| 长白| 新沂市|