javascript
在Spring中了解事务注释
1.簡介
Spring為程序性和聲明性事務(wù)提供支持。
1.1程序化交易
對于程序性事務(wù),需要顯式編寫事務(wù)管理代碼,以便在一切成功后提交,并在出現(xiàn)問題時回滾。 在這種情況下,事務(wù)管理代碼與業(yè)務(wù)邏輯緊密綁定。
1.2聲明式交易
聲明式事務(wù)將事務(wù)管理代碼與業(yè)務(wù)邏輯分開。 Spring通過Spring上下文中的XML配置或@Transactional注釋,使用事務(wù)建議(使用AOP)來支持聲明式事務(wù)。
在本教程中,我們將特別關(guān)注@Transactional批注及其工作方式。
2.實(shí)施
要在基于Spring的應(yīng)用程序中開始使用@Transactional批注,我們需要先在Spring應(yīng)用程序中啟用批注,方法是將所需的配置添加到spring上下文文件中–
<tx:annotation-driven transaction-manager="txManager"/>接下來是定義事務(wù)管理器Bean,其名稱與上述transaction-manager屬性值中指定的名稱相同。
交易經(jīng)理可能是–
2.1數(shù)據(jù)源交易管理器
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref= "datasource" /> </bean>2.2休眠事務(wù)管理器
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref= "sessionFactory" /> </bean>2.3 JPA交易管理器
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory" /> </bean>現(xiàn)在,我們準(zhǔn)備在類或方法級別使用@Transactional批注。
@Transactional(value = "myTransactionManager", propagation = Propagation.REQUIRED, readOnly = true) public void myMethod() {... }3.相關(guān)鏈接
- 將Hibernate與Spring MVC和Maven集成
- Hibernate Framework簡介
4.了解@Transactional批注
在較高的層次上,當(dāng)一個類在其本身或其成員上聲明@Transactional時,Spring將創(chuàng)建一個代理,該代理實(shí)現(xiàn)與您要注釋的類相同的接口。 換句話說,Spring將Bean包裝在代理中,而Bean本身對此一無所知。 代理為Spring提供了一種在方法調(diào)用之前,之后或周圍將行為注入到被代理對象中的方式。
在內(nèi)部,它與使用事務(wù)通知(使用AOP)相同,在代理中首先創(chuàng)建代理,然后在目標(biāo)bean的方法之前/之后調(diào)用代理。
生成的代理對象提供了由Spring創(chuàng)建的TransactionInterceptor 。 因此,當(dāng)從客戶端代碼調(diào)用@Transactional方法時,首先從代理對象調(diào)用TransactionInterceptor ,該代理對象開始事務(wù)并最終在目標(biāo)bean上調(diào)用該方法。 調(diào)用完成后, TransactionInterceptor相應(yīng)地提交/回滾事務(wù)。
注意,只有來自目標(biāo)bean“外部”的調(diào)用才通過代理。
5.了解傳播和只讀注釋屬性
5.1交易只讀
如果未將readOnly屬性顯式設(shè)置為true ,則將具有讀/寫事務(wù)。
顯式地指定readOnly屬性總是更好的選擇,因為我們已經(jīng)注意到,Hibernate大大改善了性能。
5.2交易傳播
默認(rèn)情況下,事務(wù)傳播是必需的,這意味著同一事務(wù)將從事務(wù)調(diào)用方傳播到事務(wù)被調(diào)用方。 它將創(chuàng)建一個新事務(wù),或在可用的情況下重用該事務(wù)。 例如,如果只讀事務(wù)調(diào)用讀寫事務(wù)方法,則整個事務(wù)將為只讀。
根據(jù)事務(wù)傳播屬性(例如REQUIRES_NEW ),有時會在某個時候掛起/暫停現(xiàn)有事務(wù),總是啟動并最終提交新事務(wù),然后恢復(fù)第一個事務(wù)。
5.3隔離度
隔離級別定義了事務(wù)之間的合同。
- 讀取未提交 –線程尚未提交事務(wù)且另一個線程正在讀取臟數(shù)據(jù)時,允許進(jìn)行臟讀。
- 已提交讀 –不允許臟讀。 僅允許線程讀取另一個線程中其他正在運(yùn)行的事務(wù)已提交的值。
- 重復(fù)讀取 –如果在同一事務(wù)中兩次讀取相同的數(shù)據(jù),則它將始終相同。 此級別保證一旦讀取就不會更改任何數(shù)據(jù)。
- 可序列化 –事務(wù)在所有級別都處于鎖定狀態(tài)(讀取,范圍和寫入鎖定),因此,它們以固定的順序執(zhí)行。 它不允許并發(fā)事務(wù)并導(dǎo)致性能下降。
使用“可重復(fù)讀取”隔離級別,從事務(wù)開始就維護(hù)數(shù)據(jù)庫的狀態(tài)。 如果您檢索會話1的值,則在會話2更新值,在會話1再次檢索它會返回相同的結(jié)果。
6.源代碼下載
- 下載源代碼
- 休眠性能調(diào)整
翻譯自: https://www.javacodegeeks.com/2016/05/understanding-transactional-annotation-spring.html
總結(jié)
以上是生活随笔為你收集整理的在Spring中了解事务注释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓手机彩信怎么发(安卓手机彩信)
- 下一篇: 使用Spring Reactor Cor