前言:
博主在最近的幾次面試中,大中小廠都問到了Spring的事務(wù)相關(guān)問題,這塊知識確實是面試中的重點內(nèi)容,因此結(jié)合所看的書籍,在這篇文章中總結(jié)下。該專欄比較適合剛?cè)肟覬ava的小白以及準(zhǔn)備秋招的大佬閱讀,感謝大佬的關(guān)注。
如果文章有什么需要改進的地方歡迎大佬提出,對大佬有幫助希望可以支持下哦~
小威在此先感謝各位小伙伴兒了??
以下正文開始
Spring事務(wù)包括聲明式事務(wù)管理和注解式事務(wù)管理,我們通過概念和小demo的形式一步一步地來一起學(xué)習(xí)這個知識點!
聲明式事務(wù)管理
首先簡單介紹下Spring的聲明式事務(wù)管理:
聲明式事務(wù)管理是指通過配置來實現(xiàn)事務(wù)管理,我們只需定義事務(wù)邊界和事務(wù)屬性,不需要顯式編寫事務(wù)管理的代碼。
那么我們?nèi)绾螌崿F(xiàn)呢?
首先配置事務(wù)管理器和數(shù)據(jù)源:通過配置 <bean>
元素,使用 TransactionManager 類型的 Bean 來提供事務(wù)管理器的實例,并使用 DataSource 類型的 Bean 來提供數(shù)據(jù)源。
接著定義事務(wù)邊界:使用 <tx:advice>
元素來定義事務(wù)邊界和事務(wù)屬性,指定哪些方法需要進行事務(wù)管理。
還需要配置事務(wù)通知:使用 <aop:config>
元素來啟用事務(wù)管理功能并將事務(wù)通知應(yīng)用到指定的切入點上。
理論知識先講到這里,儲備這些知識可以和面試官進行交流~
注解式管理事務(wù)
除了上面提到的聲明式管理之外,Spring提供了一種更加簡單且強大的方式來管理事務(wù),通過使用注解式事務(wù),可以在方法級別上進行聲明和配置事務(wù)的行為。這塊面試官問的更多,我們來詳細介紹下:
@Transactional注解(核心注解): @Transactional是Spring中最常用的注解之一,用于標(biāo)識需要進行事務(wù)管理的方法或類。它可以應(yīng)用在方法上或類上,而且還可以配置這些屬性:
- value:指定事務(wù)管理器的名稱(如果有多個事務(wù)管理器)。
- propagation:指定事務(wù)傳播行為,默認值為REQUIRED。
- isolation:指定事務(wù)隔離級別,默認值為DEFAULT。
- readOnly:指定事務(wù)是否為只讀事務(wù),默認值為false。
- timeout:指定事務(wù)超時時間,默認值為-1,表示不設(shè)置超時。
事務(wù)傳播行為
上面介紹了Spring實現(xiàn)事務(wù)的兩種方式,接下來介紹下另一個重量級的知識點–》事務(wù)傳播行為。
事務(wù)傳播行為定義了當(dāng)一個事務(wù)方法調(diào)用另一個事務(wù)方法時,如何處理事務(wù)的范圍。Spring提供了多種傳播行為選項,包括:
- 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ù)中作為一個保存點,可以回滾到該保存點。
事務(wù)隔離級別
接下來介紹下 spring的事務(wù)隔離級別,這一塊也是面試官經(jīng)常問到的一點。它與數(shù)據(jù)庫的事務(wù)隔離級別有著異曲同工之妙。
事務(wù)隔離級別定義了多個事務(wù)同時運行時彼此之間的可見性和影響范圍。Spring支持以下事務(wù)隔離級別:
- DEFAULT:使用數(shù)據(jù)庫默認的事務(wù)隔離級別。
- READ_UNCOMMITTED:最低級別的隔離級別,允許讀取未提交的數(shù)據(jù)。
- READ_COMMITTED:允許讀取已提交的數(shù)據(jù)。
- REPEATABLE_READ:對同一數(shù)據(jù)的多次讀取結(jié)果保持一致,避免臟讀和不可重復(fù)讀。
- SERIALIZABLE:最高級別的隔離級別,確保事務(wù)串行執(zhí)行,避免任何并發(fā)問題。
- 只讀事務(wù)(readOnly): 如果一個事務(wù)中的方法僅執(zhí)行讀操作而不進行寫操作時,可以將事務(wù)標(biāo)記為只讀事務(wù)。這樣做可以提高性能,因為只讀事務(wù)不需要對數(shù)據(jù)進行鎖定。
學(xué)生管理系統(tǒng)demo
如果上面的概念看著有點懵,那么接下來讓我們通過一個學(xué)生管理系統(tǒng)的demo來詳細介紹 Spring 的聲明式事務(wù)和基于注解的事務(wù)管理。
我從項目中扒出來部分偽代碼,現(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>
元素,我們可以指定需要進行事務(wù)管理的方法并定義事務(wù)傳播行為。
最后,在 Spring 配置文件中,我們需要啟用事務(wù)管理功能并配置事務(wù)通知。
<tx:annotation-driven transaction-manager="transactionManager" />
我們配置了以上代碼,因此Spring 會自動掃描帶有 @Transactional 注解的方法,并生成事務(wù)通知。
使用注解的事務(wù)管理demo
首先第一步也是配置事務(wù)管理器和數(shù)據(jù)源,這一步與聲明式事務(wù)管理相同,因此不在贅述。
接著定義事務(wù)邊界,這點與聲明式事務(wù)管理相比,基于注解的事務(wù)管理不再需要在 Spring 配置文件中進行額外的配置。我們只需在服務(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ù)類中的方法上,我們直接就實現(xiàn)了對 addStudent() 和 updateStudent() 方法的事務(wù)管理。
同時,我們也可以將 @Transactional 注解應(yīng)用到接口定義或抽象類的方法上,以便在子類中繼承和覆蓋時繼續(xù)享受事務(wù)管理功能。
面試這樣答
聲明式事務(wù)管理和基于注解的事務(wù)管理是 Spring 提供的兩種常用事務(wù)管理方式。它們都能夠簡化事務(wù)管理的配置和編寫,并提供了靈活的事務(wù)特性。
在聲明式事務(wù)管理中,我們使用 XML 配置或注解來定義事務(wù)邊界和事務(wù)通知。通過使用 <tx:advice>
元素和 <tx:method>
元素,我們可以指定需要進行事務(wù)管理的方法并定義事務(wù)傳播行為。
而基于注解的事務(wù)管理更加簡潔,只需在服務(wù)類的方法上添加 @Transactional 注解即可實現(xiàn)事務(wù)管理。
無論是哪種方式,Spring 的事務(wù)管理機制都使得我們能夠輕松實現(xiàn)數(shù)據(jù)的一致性和完整性。通過合理配置事務(wù)特性,我們可以滿足不同業(yè)務(wù)場景下的事務(wù)需求。
文章到這里就先結(jié)束了,感興趣的可以訂閱專欄哈,后續(xù)會繼續(xù)分享相關(guān)的知識點。文章來源:http://www.zghlxwxcb.cn/news/detail-583620.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-583620.html
到了這里,關(guān)于Spring的兩種事務(wù)管理機制,面試這樣答當(dāng)場入職!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!