您好,登錄后才能下訂單哦!
這篇文章主要介紹“Spring基于注解怎么配置事務的屬性”,在日常操作中,相信很多人在Spring基于注解怎么配置事務的屬性問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring基于注解怎么配置事務的屬性”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在Spring中,事務屬性描述了事務策略如何應用到方法上,事務屬性包含5個方面:
① 傳播行為
② 隔離級別
③ 回滾策略
④ 超時時間
⑤ 是否只讀
1、當事務方法被另一個事務方法調用時,必須指定事務應該如何傳播。例如,方法可能繼續在現有的事務中允許,也可能開啟一個新事務,并在自己的事務中運行。
2、事務的傳播行為可以由傳播屬性指定,Spring定義了7種類型的傳播行為。其中最常用的是REQUIRED
和REQUIRES_NEW
。
3、事務的傳播屬性可以在@Transactional注解的propagation屬性中定義。
4、舉個例子:
/** * 使用 @Transactional 指定事務方法 */ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { /** * 1. 添加事務注解@Transactional。 * 2. 使用 propagation 指定事務的傳播行為, * 即當前事務方法被另外一個事務方法調用時,如何使用事務: * 是使用調用方法的事務,還是開啟一個新事務(使用自己的事務)。 * 3. propagation: * ① 默認值是 Propagation.REQUIRED, 即使用調用方法的事務。 * ② 可以指定為 Propagation.REQUIRES_NEW, 即在調用方法的事務中開啟一個新事務(自己的事務)。 */ @Transactional(propagation = Propagation.REQUIRES_NEW) public void purchaseSigleBook(String acctName, String bookId) { ... } }
1、從理論上來說,事務應該彼此完全隔離,以避免并發事務所導致的問題。然而,那樣會對性能產生極大的影響,因為事務必須按順序運行。
2、在實際開發中,為了提升性能,事務會以較低的隔離級別運行。
3、事務的隔離級別可以通過隔離級別事務屬性(isolation
)指定。
4、Spring支持的事務隔離級別:
事務的隔離級別要得到底層數據庫引擎的支持,而不是應用程序或者框架的支持。
Oracle 支持的2種事務隔離級別:READ_COMMIT。
MySQL 支持4種事務隔離級別:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ 和 SERIALIZABLE。
5、用@Transactional
注解聲明式的管理事務時可以在 @Transactional 的isolation
屬性中設置隔離級別。
6、舉個例子:
/** 1. 使用 @Transactional 指定事務方法 */ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { /** * 1. 添加事務注解@Transactional。 * 2. 使用isolation屬性指定事務的隔離級別,最常用的的取值是: Isolation.READ_COMMITTED。 */ @Transactional(isolation = Isolation.READ_COMMITTED) public void purchaseSigleBook(String acctName, String bookId) { ... } }
1、默認情況下只有未檢查異常( RuntimeException 和 Error 類型的異常)會導致事務回滾,而檢查異常不會。
2、事務回滾的規則可以通過 @Transactional
注解的 rollbackFor
和 noRollbackFor
屬性來定義,這兩個屬性被聲明為Class[] 類型的,因此可以為這兩個屬性指定多個異常類。
① rollbackFor:指定遇到哪些異常時必須進行回滾。
② noRollbackFor:指定遇到哪些異常時,必須不回滾。
3、舉個例子:
/** * 使用 @Transactional 指定事務方法 */ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { /** * 1. 添加事務注解@Transactional。 * 2. 使用rollbackFor 和 noRollbackFor指定事務遇到哪些異常時進行強制回滾或者強制不回滾。 * 默認情況下,Spring聲明事務對所有運行時異常進行回滾.通常取默認值。 */ @Transactional(noRollbackFor = {UserAccounException.class}) public void purchaseSigleBook(String acctName, String bookId) { ... } }
1、如果一個事務只讀取數據但不修改數據,數據庫引擎可以對這個事務進行優化。
2、只讀事務屬性:表示這個事務只讀取數據但不更新數,這樣可以幫助數據庫進行優化事務。
3、只讀屬性可以在@Transactional
注解中readOnly
屬性中定義,其取值只有true和false。
4、舉個例子:
/** * 使用 @Transactional 指定事務方法 */ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { /** * 1. 添加事務注解@Transactional。 * 2. 使用 readOnly 只讀事務的只讀屬性,表示這個事務是否只讀取數據而不修改數據。 */ @Transactional(readOnly = true) public void purchaseSigleBook(String acctName, String bookId) { ... } }
1、由于事務可以在行和表上獲得鎖,因此長期運行的事務會占用資源,并對整體性能產生影響。
2、超時事務屬性:事務在強制回滾之前可以保持多久,這樣可以防止長期運行的事務占用資源。
3、超時屬性可以在 @Transactional注解中timeout屬性中定義,其單位為秒。
4、舉個例子:
/** * 使用 @Transactional 指定事務方法 */ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { /** * 1. 添加事務注解@Transactional。 * 2. 使用 timeout 指定事務的超時屬性,表示在強制回滾之前,這個事務能運行多久,單位是秒。 */ @Transactional(timeout = 3) public void purchaseSigleBook(String acctName, String bookId) { ... } }
到此,關于“Spring基于注解怎么配置事務的屬性”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。