Spring中的@Transactional注解使用詳解
@Transactional 注解介紹
@Transactional 是一個(gè)注解,用于在 Spring 框架中管理事務(wù)的聲明式事務(wù)管理機(jī)制。
它可以應(yīng)用于方法或類級(jí)別,并指示方法或類在執(zhí)行時(shí)應(yīng)該被包裝在一個(gè)事務(wù)中。
使用 @Transactional 注解的方法在執(zhí)行時(shí)會(huì)被 Spring 框架自動(dòng)處理事務(wù)的起始、提交或回滾等操作,簡(jiǎn)化了事務(wù)管理的編碼工作。
- 當(dāng)方法執(zhí)行成功時(shí),事務(wù)會(huì)被提交,數(shù)據(jù)的變更會(huì)持久化到數(shù)據(jù)庫;
- 當(dāng)方法執(zhí)行失敗時(shí),事務(wù)會(huì)被回滾,之前的數(shù)據(jù)變更會(huì)被撤銷。
@Transactional 注解的常見屬性和行為
- propagation:指定事務(wù)的傳播行為。它定義了事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí),事務(wù)應(yīng)該如何傳播。常用的傳播行為包括 REQUIRED、REQUIRES_NEW、NESTED 等。
- isolation:指定事務(wù)的隔離級(jí)別。它定義了事務(wù)方法在并發(fā)環(huán)境中處理數(shù)據(jù)一致性的程度,包括 DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE 等級(jí)別。
- readOnly:指定事務(wù)是否為只讀。如果設(shè)置為 true,則表示事務(wù)只讀,不會(huì)對(duì)數(shù)據(jù)進(jìn)行修改。這樣可以提高數(shù)據(jù)庫的讀取性能。
- timeout:指定事務(wù)的超時(shí)時(shí)間(以秒為單位)。如果事務(wù)執(zhí)行時(shí)間超過指定的超時(shí)時(shí)間,事務(wù)將被回滾。
- rollbackFor 和 noRollbackFor:用于指定在遇到特定的異常時(shí)事務(wù)是否回滾??梢栽O(shè)置特定的異常類,或者使用異常類的父類或接口。
- rollbackOn 和 noRollbackOn:與 rollbackFor 和 noRollbackFor 類似,用于指定在遇到特定的異常類型時(shí)事務(wù)是否回滾,但使用的是異常類的名字字符串。
- value 和 transactionManager:用于指定事務(wù)管理器的名稱。如果應(yīng)用中存在多個(gè)事務(wù)管理器,可以通過這兩個(gè)屬性指定使用哪個(gè)事務(wù)管理器。
以下是一個(gè)示例代碼,展示了 @Transactional 注解的使用:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
public void saveOrder(Order order) {
// 保存訂單的邏輯
// ...
}
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void updateProductQuantity(String productId, int quantity) {
// 更新產(chǎn)品庫存的邏輯
// ...
}在上述示例中,saveOrder 方法和 updateProductQuantity 方法都被 @Transactional 注解修飾,表示它們會(huì)在事務(wù)中執(zhí)行。
saveOrder 方法使用默認(rèn)的傳播行為和隔離級(jí)別,而 updateProductQuantity 方法指定了傳播行為為 REQUIRED,隔離級(jí)別為 READ_COMMITTED。
需要注意的是,@Transactional 注解只能應(yīng)用于公共方法。當(dāng)調(diào)用被注解的方法時(shí),事務(wù)的生效是通過 Spring AOP 實(shí)現(xiàn)的,所以該注解需要在 Spring 管理的 Bean 中才能生效。
同時(shí),建議將 @Transactional 注解應(yīng)用在業(yè)務(wù)層而非持久層,以便事務(wù)的粒度更加明確和控制。
總結(jié)
要知道@Transactional注解里面每個(gè)屬性的含義。@Transactional注解屬性就是來控制事務(wù)屬性的。通過這些屬性來生成事務(wù)。
要明確我們添加的@Transactional注解會(huì)不會(huì)起作用。
@Transactional注解在外部調(diào)用的函數(shù)上才有效果,內(nèi)部調(diào)用的函數(shù)添加無效,要切記。這是由AOP的特性決定的。
要明確事務(wù)的作用范圍,有@Transactional的函數(shù)調(diào)用有@Transactional的函數(shù)的時(shí)候,進(jìn)入第二個(gè)函數(shù)的時(shí)候是新的事務(wù),還是沿用之前的事務(wù)。稍不注意就會(huì)拋UnexpectedRollbackException異常。
到此這篇關(guān)于Spring中的@Transactional注解使用詳解的文章就介紹到這了,更多相關(guān)@Transactional注解使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot?@Transactional事務(wù)不生效排查方式
- spring中的注解@@Transactional失效的場(chǎng)景代碼演示
- Spring中的@Transactional事務(wù)失效場(chǎng)景解讀
- Spring中@Transactional注解關(guān)鍵屬性和用法小結(jié)
- Spring的@Transactional注解使用詳細(xì)解析
- Spring中@Transactional注解的屬性說明
- Spring聲明式事務(wù)@Transactional注解實(shí)現(xiàn)元數(shù)據(jù)驅(qū)動(dòng)的事務(wù)管理
相關(guān)文章
Spring Boot 中該如何防御計(jì)時(shí)攻擊
這篇文章主要介紹了Spring Boot 中該如何防御計(jì)時(shí)攻擊,幫助大家更好的使用spring boot框架,感興趣的朋友可以了解下2020-09-09
Java使用snmp協(xié)議實(shí)現(xiàn)采集服務(wù)器信息
SNMP是一種用于管理網(wǎng)絡(luò)設(shè)備的協(xié)議,它是一種標(biāo)準(zhǔn)化的協(xié)議,被用于監(jiān)控和管理網(wǎng)絡(luò)設(shè)備,這篇文章主要介紹了Java如何使用snmp協(xié)議采集服務(wù)器信息,需要的可以參考下2024-12-12
SchedulingConfigurer實(shí)現(xiàn)動(dòng)態(tài)定時(shí),導(dǎo)致ApplicationRunner無效解決
這篇文章主要介紹了SchedulingConfigurer實(shí)現(xiàn)動(dòng)態(tài)定時(shí),導(dǎo)致ApplicationRunner無效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Spring Boot應(yīng)用的極速部署腳本示例代碼
最近在工作中遇到了一個(gè)問題,需要極速的部署Spring Boot應(yīng)用,發(fā)現(xiàn)網(wǎng)上這方面的資料較少,所以自己來總結(jié)下,這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用的極速部署腳本的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08
基于Java的電梯系統(tǒng)實(shí)現(xiàn)過程
這篇文章主要介紹了基于Java的電梯系統(tǒng)實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
SpringBoot+Vue實(shí)現(xiàn)EasyPOI導(dǎo)入導(dǎo)出的方法詳解
項(xiàng)目開發(fā)過程中,很大的需求都有 導(dǎo)入導(dǎo)出功能。本文將利用SpringBoot+Vue實(shí)現(xiàn)EasyPOI導(dǎo)入導(dǎo)出功能,感興趣的可以了解一下2022-08-08
Java數(shù)據(jù)封裝樹形結(jié)構(gòu)代碼實(shí)例
這篇文章主要介紹了Java數(shù)據(jù)封裝樹形結(jié)構(gòu)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01

