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ù)的起始、提交或回滾等操作,簡化了事務(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ù)是否回滾。可以設(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)文章希望大家以后多多支持腳本之家!
相關(guān)文章
RestTemplat中關(guān)于getForobject方法的使用
這篇文章主要介紹了RestTemplat中關(guān)于getForobject方法的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java設(shè)計(jì)模式詳解之門面模式(外觀模式)
為子系統(tǒng)中的一組接口提供一個(gè)一致的界面, Facade 模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。本文給大家介紹Java設(shè)計(jì)模式詳解之門面模式(外觀模式),感興趣的朋友參考下吧2016-04-04
Spring事務(wù)aftercommit原理及實(shí)踐
這篇文章主要為大家介紹了Spring事務(wù)aftercommit原理及實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Calcite使用SQL實(shí)現(xiàn)查詢excel內(nèi)容
因?yàn)閏alcite本身沒有excel的適配器,?所以本文將模仿calcite-file,?搞一個(gè)calcite-file-excel實(shí)現(xiàn)查詢excel內(nèi)容,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01
javaCV開發(fā)詳解之收流器實(shí)現(xiàn)
這篇文章主要介紹了javaCV開發(fā)詳解之收流器實(shí)現(xiàn),對(duì)javaCV有研究的同學(xué),可以參考下2021-04-04

