1.概述
本教程將討論配置Spring Transactions ,使用@Transactional批注和常見陷阱的正確方法 。
要更深入地討論核心持久性配置,請查看Spring with JPA教程 。
有兩種不同的配置事務的方法– 批注和AOP –每種都有自己的優勢–我們將在這里討論更常見的批注配置 。
2.在不使用XML的情況下配置事務
Spring 3.1引入了@EnableTransactionManagement批注 , 該批注將在@Configuration類中使用,并啟用事務支持:
@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){...}@Beanpublic PlatformTransactionManager transactionManager(){JpaTransactionManager transactionManager = new JpaTransactionManager();transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject() );return transactionManager;}
}
3.使用XML配置事務
在3.1之前,或者如果不能使用Java,則這是XML配置 ,使用注釋驅動和名稱空間支持:
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="myEmf" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
配置了事務后,現在可以在類或方法級別使用@Transactional注釋Bean:
@Service
@Transactional
public class FooService {...
}
注釋還支持進一步的配置 :
- 交易的傳播類型
- 交易的隔離級別
- 事務包裝的操作的超時
- readOnly標志 –持久性提供程序的提示,該事務應為只讀
- 詳細的回滾配置
5.潛在的陷阱
5.1。 交易和代理
在較高的級別上, Spring會在類或任何方法上為所有帶有@Transactional注釋的類創建代理 。 代理允許框架在調用方法之前和之后注入事務邏輯–主要用于啟動和提交事務 。
要記住的重要一點是,如果事務Bean正在實現接口,則默認情況下,代理將是Java動態代理 。 這意味著將僅攔截通過代理傳入的外部方法調用- 任何自調用將不會啟動任何事務 -即使該方法使用@Transactional進行了注釋。
使用代理的另一個警告是, 僅公共方法應使用@Transactional進行注釋 -其他可見性的方法將僅默默地忽略該注釋,因為這些代理沒有被代理。
本文在這里詳細討論了進一步的代理pitfal 。
5.2。 更改隔離級別
將Spring配置為與JPA一起使用時的主要陷阱之一是,更改事務語義的隔離將不起作用– JPA不支持自定義隔離級別 。 這是JPA的限制, 不是Spring的限制; 但是,更改@Transactional 隔離屬性將導致:
org.springframework.transaction.InvalidIsolationLevelException:標準JPA不支持自定義隔離級別–為您的JPA實現使用特殊的JpaDialect
5.3。 只讀交易
readOnly標志通常會引起混亂,尤其是在使用JPA時; 從javadoc:
這只是實際交易子系統的提示。 它不一定會導致寫訪問嘗試失敗。 當請求只讀事務時,無法解釋只讀提示的事務管理器不會引發異常。
事實是, 不能保證在設置readOnly標志時不會發生插入或更新-它的行為取決于供應商,而JPA與供應商無關。
同樣重要的是要了解readOnly標志僅在事務內部相關; 如果操作發生在事務上下文之外,則僅忽略該標志。 一個簡單的示例將調用帶有以下注釋的方法:
@Transactional( propagation = Propagation.SUPPORTS,readOnly = true )
從非事務上下文中-將不會創建事務,并且將忽略readOnly標志。
5.4。 交易記錄
通過微調事務包中的日志記錄 ,還可以更好地理解與事務相關的問題。 Spring中的相關軟件包是“ org.springframework.transaction”,應使用TRACE的日志記錄級別對其進行配置。
六,結論
我們介紹了同時使用Java和XML的事務語義的基本配置,如何使用@Transactional以及事務策略的最佳實踐。 還討論了Spring對事務測試的支持以及一些常見的JPA陷阱 。
這個簡單項目的實現可以在github項目中找到–這是一個基于Eclipse的項目,因此應易于導入和運行。
翻譯自: https://www.javacodegeeks.com/2011/12/transaction-configuration-with-jpa-and.html