Spring基于注解配置事務(wù)的屬性
本文實例為大家分享了Spring基于注解配置事務(wù)的屬性,供大家參考,具體內(nèi)容如下
一、事務(wù)屬性概述
在Spring中,事務(wù)屬性描述了事務(wù)策略如何應(yīng)用到方法上,事務(wù)屬性包含5個方面:
① 傳播行為
② 隔離級別
③ 回滾策略
④ 超時時間
⑤ 是否只讀
二、事務(wù)的傳播行為屬性##
1、當(dāng)事務(wù)方法被另一個事務(wù)方法調(diào)用時,必須指定事務(wù)應(yīng)該如何傳播。例如,方法可能繼續(xù)在現(xiàn)有的事務(wù)中允許,也可能開啟一個新事務(wù),并在自己的事務(wù)中運行。
2、事務(wù)的傳播行為可以由傳播屬性指定,Spring定義了7種類型的傳播行為。其中最常用的是REQUIRED
和REQUIRES_NEW
。
3、事務(wù)的傳播屬性可以在@Transactional注解的propagation屬性中定義。
4、舉個例子:
/** ?* 使用 @Transactional 指定事務(wù)方法 ?*/ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { ?? ?/** ?? ? * 1. 添加事務(wù)注解@Transactional。 ?? ? * 2. 使用 propagation 指定事務(wù)的傳播行為, ?? ? * 即當(dāng)前事務(wù)方法被另外一個事務(wù)方法調(diào)用時,如何使用事務(wù):? ?? ? * 是使用調(diào)用方法的事務(wù),還是開啟一個新事務(wù)(使用自己的事務(wù))。 ?? ? * 3. propagation: ?? ? * ?① 默認(rèn)值是 Propagation.REQUIRED, 即使用調(diào)用方法的事務(wù)。 ?? ? * ?② 可以指定為 Propagation.REQUIRES_NEW, 即在調(diào)用方法的事務(wù)中開啟一個新事務(wù)(自己的事務(wù))。 ?? ? */ ? ? @Transactional(propagation = Propagation.REQUIRES_NEW) ? ? public void purchaseSigleBook(String acctName, String bookId) ? ? { ? ? ? ? ... ? ? } }
三、事務(wù)的隔離級別##
1、從理論上來說,事務(wù)應(yīng)該彼此完全隔離,以避免并發(fā)事務(wù)所導(dǎo)致的問題。然而,那樣會對性能產(chǎn)生極大的影響,因為事務(wù)必須按順序運行。
2、在實際開發(fā)中,為了提升性能,事務(wù)會以較低的隔離級別運行。
3、事務(wù)的隔離級別可以通過隔離級別事務(wù)屬性(isolation
)指定。
4、Spring支持的事務(wù)隔離級別:
事務(wù)的隔離級別要得到底層數(shù)據(jù)庫引擎的支持,而不是應(yīng)用程序或者框架的支持。
Oracle 支持的2種事務(wù)隔離級別:READ_COMMIT。
MySQL 支持4種事務(wù)隔離級別:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ 和 SERIALIZABLE。
5、用@Transactional
注解聲明式的管理事務(wù)時可以在 @Transactional 的isolation
屬性中設(shè)置隔離級別。
6、舉個例子:
/** ?1. 使用 @Transactional 指定事務(wù)方法 ?*/ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { ?? ?/** ?? ? * 1. 添加事務(wù)注解@Transactional。 ?? ? * 2. 使用isolation屬性指定事務(wù)的隔離級別,最常用的的取值是: Isolation.READ_COMMITTED。 ?? ? */ ? ? @Transactional(isolation = Isolation.READ_COMMITTED) ? ? public void purchaseSigleBook(String acctName, String bookId) ? ? { ? ? ? ? ... ? ? } }
四、事務(wù)的回滾屬性##
1、默認(rèn)情況下只有未檢查異常( RuntimeException 和 Error 類型的異常)會導(dǎo)致事務(wù)回滾,而檢查異常不會。
2、事務(wù)回滾的規(guī)則可以通過 @Transactional
注解的 rollbackFor
和 noRollbackFor
屬性來定義,這兩個屬性被聲明為Class[] 類型的,因此可以為這兩個屬性指定多個異常類。
① rollbackFor:指定遇到哪些異常時必須進行回滾。
② noRollbackFor:指定遇到哪些異常時,必須不回滾。
3、舉個例子:
/** ?* 使用 @Transactional 指定事務(wù)方法 ?*/ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { ?? ?/** ?? ? * 1. 添加事務(wù)注解@Transactional。 ?? ? * 2. 使用rollbackFor 和 noRollbackFor指定事務(wù)遇到哪些異常時進行強制回滾或者強制不回滾。 ?? ? * 默認(rèn)情況下,Spring聲明事務(wù)對所有運行時異常進行回滾.通常取默認(rèn)值。 ?? ? */ ? ? @Transactional(noRollbackFor = {UserAccounException.class}) ? ? public void purchaseSigleBook(String acctName, String bookId) ? ? { ? ? ? ? ... ? ? } }
五、事務(wù)的只讀屬性##
1、如果一個事務(wù)只讀取數(shù)據(jù)但不修改數(shù)據(jù),數(shù)據(jù)庫引擎可以對這個事務(wù)進行優(yōu)化。
2、只讀事務(wù)屬性:表示這個事務(wù)只讀取數(shù)據(jù)但不更新數(shù),這樣可以幫助數(shù)據(jù)庫進行優(yōu)化事務(wù)。
3、只讀屬性可以在@Transactional
注解中readOnly
屬性中定義,其取值只有true和false。
4、舉個例子:
/** ?* 使用 @Transactional 指定事務(wù)方法 ?*/ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { ?? ?/** ?? ? * 1. 添加事務(wù)注解@Transactional。 ?? ? * 2. 使用 readOnly 只讀事務(wù)的只讀屬性,表示這個事務(wù)是否只讀取數(shù)據(jù)而不修改數(shù)據(jù)。 ?? ? */ ? ? @Transactional(readOnly = true) ? ? public void purchaseSigleBook(String acctName, String bookId) ? ? { ? ? ? ? ... ? ? } }
##六、事務(wù)的超時屬性##
1、由于事務(wù)可以在行和表上獲得鎖,因此長期運行的事務(wù)會占用資源,并對整體性能產(chǎn)生影響。
2、超時事務(wù)屬性:事務(wù)在強制回滾之前可以保持多久,這樣可以防止長期運行的事務(wù)占用資源。
3、超時屬性可以在 @Transactional注解中timeout屬性中定義,其單位為秒。
4、舉個例子:
/** ?* 使用 @Transactional 指定事務(wù)方法 ?*/ @Service("bookShopService") public class BookShopServiceImpl implements BookShopService { ?? ?/** ?? ? * 1. 添加事務(wù)注解@Transactional。 ?? ? * 2. 使用 timeout 指定事務(wù)的超時屬性,表示在強制回滾之前,這個事務(wù)能運行多久,單位是秒。 ?? ? */ ? ? @Transactional(timeout = 3) ? ? public void purchaseSigleBook(String acctName, String bookId) ? ? { ? ? ? ? ... ? ? } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一篇文章帶你認(rèn)識Java8接口的默認(rèn)方法
這篇文章主要給大家介紹了如何通過一篇文章帶你認(rèn)識Java8接口的默認(rèn)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法
這篇文章主要介紹了Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法,文中舉了用其啟動線程和設(shè)置線程優(yōu)先級的例子,需要的朋友可以參考下2016-03-03Mybatis配置之<properties>屬性配置元素解析
這篇文章主要介紹了Mybatis配置之<properties>屬性配置元素解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Java并發(fā)編程示例(七):守護線程的創(chuàng)建和運行
這篇文章主要介紹了Java并發(fā)編程示例(七):守護線程的創(chuàng)建和運行,在本節(jié)示例中,我們將創(chuàng)建兩個線程,一個是普通線程,向隊列中寫入事件,另外一個是守護線程,清除隊列中的事件,需要的朋友可以參考下2014-12-12