Spring中的@Transactional注解使用詳解
@Transactional 注解介紹
@Transactional 是一個注解,用于在 Spring 框架中管理事務(wù)的聲明式事務(wù)管理機制。
它可以應(yīng)用于方法或類級別,并指示方法或類在執(zhí)行時應(yīng)該被包裝在一個事務(wù)中。
使用 @Transactional 注解的方法在執(zhí)行時會被 Spring 框架自動處理事務(wù)的起始、提交或回滾等操作,簡化了事務(wù)管理的編碼工作。
- 當(dāng)方法執(zhí)行成功時,事務(wù)會被提交,數(shù)據(jù)的變更會持久化到數(shù)據(jù)庫;
- 當(dāng)方法執(zhí)行失敗時,事務(wù)會被回滾,之前的數(shù)據(jù)變更會被撤銷。
@Transactional 注解的常見屬性和行為
- propagation:指定事務(wù)的傳播行為。它定義了事務(wù)方法被另一個事務(wù)方法調(diào)用時,事務(wù)應(yīng)該如何傳播。常用的傳播行為包括 REQUIRED、REQUIRES_NEW、NESTED 等。
- isolation:指定事務(wù)的隔離級別。它定義了事務(wù)方法在并發(fā)環(huán)境中處理數(shù)據(jù)一致性的程度,包括 DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE 等級別。
- readOnly:指定事務(wù)是否為只讀。如果設(shè)置為 true,則表示事務(wù)只讀,不會對數(shù)據(jù)進(jìn)行修改。這樣可以提高數(shù)據(jù)庫的讀取性能。
- timeout:指定事務(wù)的超時時間(以秒為單位)。如果事務(wù)執(zhí)行時間超過指定的超時時間,事務(wù)將被回滾。
- rollbackFor 和 noRollbackFor:用于指定在遇到特定的異常時事務(wù)是否回滾??梢栽O(shè)置特定的異常類,或者使用異常類的父類或接口。
- rollbackOn 和 noRollbackOn:與 rollbackFor 和 noRollbackFor 類似,用于指定在遇到特定的異常類型時事務(wù)是否回滾,但使用的是異常類的名字字符串。
- value 和 transactionManager:用于指定事務(wù)管理器的名稱。如果應(yīng)用中存在多個事務(wù)管理器,可以通過這兩個屬性指定使用哪個事務(wù)管理器。
以下是一個示例代碼,展示了 @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 注解修飾,表示它們會在事務(wù)中執(zhí)行。
saveOrder 方法使用默認(rèn)的傳播行為和隔離級別,而 updateProductQuantity 方法指定了傳播行為為 REQUIRED,隔離級別為 READ_COMMITTED。
需要注意的是,@Transactional 注解只能應(yīng)用于公共方法。當(dāng)調(diào)用被注解的方法時,事務(wù)的生效是通過 Spring AOP 實現(xiàn)的,所以該注解需要在 Spring 管理的 Bean 中才能生效。
同時,建議將 @Transactional 注解應(yīng)用在業(yè)務(wù)層而非持久層,以便事務(wù)的粒度更加明確和控制。
總結(jié)
要知道@Transactional注解里面每個屬性的含義。@Transactional注解屬性就是來控制事務(wù)屬性的。通過這些屬性來生成事務(wù)。
要明確我們添加的@Transactional注解會不會起作用。
@Transactional注解在外部調(diào)用的函數(shù)上才有效果,內(nèi)部調(diào)用的函數(shù)添加無效,要切記。這是由AOP的特性決定的。
要明確事務(wù)的作用范圍,有@Transactional的函數(shù)調(diào)用有@Transactional的函數(shù)的時候,進(jìn)入第二個函數(shù)的時候是新的事務(wù),還是沿用之前的事務(wù)。稍不注意就會拋UnexpectedRollbackException異常。
到此這篇關(guān)于Spring中的@Transactional注解使用詳解的文章就介紹到這了,更多相關(guān)@Transactional注解使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
RestTemplat中關(guān)于getForobject方法的使用
這篇文章主要介紹了RestTemplat中關(guān)于getForobject方法的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Calcite使用SQL實現(xiàn)查詢excel內(nèi)容
因為calcite本身沒有excel的適配器,?所以本文將模仿calcite-file,?搞一個calcite-file-excel實現(xiàn)查詢excel內(nèi)容,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01