Spring的兩種事務(wù)管理機(jī)制的基本概念和demo示例
聲明式事務(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ìn)行聲明和配置事務(wù)的行為。這塊面試官問的更多,我們來詳細(xì)介紹下:
@Transactional注解(核心注解): @Transactional是Spring中最常用的注解之一,用于標(biāo)識需要進(jìn)行事務(wù)管理的方法或類。它可以應(yīng)用在方法上或類上,而且還可以配置這些屬性:
- value:指定事務(wù)管理器的名稱(如果有多個事務(wù)管理器)。
- propagation:指定事務(wù)傳播行為,默認(rèn)值為REQUIRED。
- isolation:指定事務(wù)隔離級別,默認(rèn)值為DEFAULT。
- readOnly:指定事務(wù)是否為只讀事務(wù),默認(rèn)值為false。
- timeout:指定事務(wù)超時時間,默認(rèn)值為-1,表示不設(shè)置超時。
事務(wù)傳播行為
上面介紹了Spring實(shí)現(xiàn)事務(wù)的兩種方式,接下來介紹下另一個重量級的知識點(diǎn)–》事務(wù)傳播行為。
事務(wù)傳播行為定義了當(dāng)一個事務(wù)方法調(diào)用另一個事務(wù)方法時,如何處理事務(wù)的范圍。Spring提供了多種傳播行為選項(xiàng),包括:
- REQUIRED:如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù);如果已存在事務(wù),則加入到當(dāng)前事務(wù)中。
- REQUIRES_NEW:每次都會創(chuàng)建一個新的事務(wù),如果已存在事務(wù)則將其掛起。
- SUPPORTS:如果當(dāng)前存在事務(wù),則加入到當(dāng)前事務(wù)中;如果沒有事務(wù),則以非事務(wù)方式執(zhí)行。
- NOT_SUPPORTED:以非事務(wù)方式執(zhí)行方法,如果當(dāng)前存在事務(wù)則將其掛起。
- NEVER:以非事務(wù)方式執(zhí)行方法,如果當(dāng)前存在事務(wù)則拋出異常。
- MANDATORY:如果當(dāng)前存在事務(wù),則加入到當(dāng)前事務(wù)中;如果沒有事務(wù),則拋出異常。
- NESTED:如果當(dāng)前存在事務(wù),則將該事務(wù)嵌套到當(dāng)前事務(wù)中作為一個保存點(diǎn),可以回滾到該保存點(diǎn)。
事務(wù)隔離級別
接下來介紹下 spring的事務(wù)隔離級別,這一塊也是面試官經(jīng)常問到的一點(diǎn)。它與數(shù)據(jù)庫的事務(wù)隔離級別有著異曲同工之妙。
事務(wù)隔離級別定義了多個事務(wù)同時運(yùn)行時彼此之間的可見性和影響范圍。Spring支持以下事務(wù)隔離級別:
- DEFAULT:使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別。
- READ_UNCOMMITTED:最低級別的隔離級別,允許讀取未提交的數(shù)據(jù)。
- READ_COMMITTED:允許讀取已提交的數(shù)據(jù)。
- REPEATABLE_READ:對同一數(shù)據(jù)的多次讀取結(jié)果保持一致,避免臟讀和不可重復(fù)讀。
- SERIALIZABLE:最高級別的隔離級別,確保事務(wù)串行執(zhí)行,避免任何并發(fā)問題。
- 只讀事務(wù)(readOnly): 如果一個事務(wù)中的方法僅執(zhí)行讀操作而不進(jìn)行寫操作時,可以將事務(wù)標(biāo)記為只讀事務(wù)。這樣做可以提高性能,因?yàn)橹蛔x事務(wù)不需要對數(shù)據(jù)進(jìn)行鎖定。
學(xué)生管理系統(tǒng)demo
如果上面的概念看著有點(diǎn)懵,那么接下來讓我們通過一個學(xué)生管理系統(tǒng)的demo來詳細(xì)介紹 Spring 的聲明式事務(wù)和基于注解的事務(wù)管理。
我從項(xiàng)目中扒出來部分偽代碼,現(xiàn)在我們有一個簡單的學(xué)生管理系統(tǒng),其中包含兩個服務(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 會自動掃描帶有 @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ù)管理。
同時,我們也可以將 @Transactional 注解應(yīng)用到接口定義或抽象類的方法上,以便在子類中繼承和覆蓋時繼續(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)文章
Spring?MVC請求轉(zhuǎn)發(fā)與請求重定向的示例詳解
轉(zhuǎn)發(fā)指服務(wù)器接收請求后,從一個資源跳轉(zhuǎn)到另一個資源中,請求轉(zhuǎn)發(fā)是一次請求,不會改變?yōu)g覽器的請求地址,這篇文章主要介紹了Spring?MVC請求轉(zhuǎn)發(fā)與請求重定向的相關(guān)知識,需要的朋友可以參考下2023-09-09Mybatis-Plus實(shí)現(xiàn)公共字段自動填充的項(xiàng)目實(shí)踐
本文主要介紹了Mybatis-Plus實(shí)現(xiàn)公共字段自動填充的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Spring Bean三級緩存機(jī)制的技術(shù)指南
在 Spring 框架中,Bean 的創(chuàng)建和管理是容器的核心功能之一,了提高性能,Spring 采用了多級緩存機(jī)制來減少不必要的對象創(chuàng)建和配置,本文將詳細(xì)介紹 Spring 中 Bean 三級緩存的實(shí)現(xiàn)原理,并通過代碼示例幫助你理解這個機(jī)制的工作方式,需要的朋友可以參考下2025-04-04spring boot配置ssl(多cer格式)超詳細(xì)教程
這篇文章主要介紹了spring boot配置ssl(多cer格式)超詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11Spring Boot配置接口WebMvcConfigurer的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot配置接口WebMvcConfigurer的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Java實(shí)現(xiàn)word文檔轉(zhuǎn)成圖片的示例詳解
本文主要為大家詳細(xì)介紹了如何在Java項(xiàng)目中引用aspose-words和poi-tljar包實(shí)現(xiàn)word文檔轉(zhuǎn)成圖片,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10關(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解
下面小編就為大家?guī)硪黄P(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03