與EJB相似,Spring提供了對編碼式
和聲明式
事務管理的支持。可是,Spring對事務管理的能力遠遠超過EJB。這裏就不詳細介紹編碼式事務和聲明式事務的區別了。有興趣的讀者能夠自行Google。java
Spring對事務管理是經過事務管理器來實現的。Spring提供了許多內置事務管理器實現:spring
事務管理器 ( org.springframework.* ) |
使用場景 |
---|---|
DataSourceTransactionManager |
數據源事務管理器,提供對單個javax.sql.DataSource 事務管理,用於Spring JDBC抽象框架、iBATIS或MyBatis框架的事務管理; |
JdoTransactionManager |
提供對單個javax.jdo.PersistenceManagerFactor y事務管理,用於集成JDO框架時的事務管理; |
JpaTransactionManager |
提供對單個javax.persistence.EntityManagerFactory 事務支持,用於集成JPA實現框架時的事務管理; |
HibernateTransactionManager |
提供對單個org.hibernate.SessionFactory 事務支持,用於集成Hibernate框架時的事務管理;該事務管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本; |
JtaTransactionManager |
提供對分佈式事務管理的支持,並將事務管理委託給Java EE應用服務器事務管理器; |
OC4JjtaTransactionManager |
Spring提供的對OC4J10.1.3+應用服務器事務管理器的適配器,此適配器用於對應用服務器提供的高級事務的支持; |
WebSphereUowTransactionManager |
Spring提供的對WebSphere 6.0+應用服務器事務管理器的適配器,此適配器用於對應用服務器提供的高級事務的支持; |
WebLogicJtaTransactionManager |
Spring提供的對WebLogic 8.1+應用服務器事務管理器的適配器,此適配器用於對應用服務器提供的高級事務的支持。 |
以上就是Spring中支持使用的事務管理器,通常咱們比較經常使用的就是HibernateTransactionManager
和DataSourceTransactionManager
。咱們在使用事務的時候要聲明要使用哪一種事務管理器。如:sql
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
spring中,聲明事務是經過事務屬性來定義的。事務屬性描述了事務策略如何應用到方法上事務屬性包含5個方面:數據庫
傳播行爲後端
隔離級別服務器
回滾規則併發
事務超時框架
是否只讀分佈式
這裏簡單介紹一下這五個屬性。優化
傳播行爲定義了客戶端與被調用方法之間的事務邊界,即傳播規則回答了這樣的一個問題,新的事務應該被啓動仍是掛起,或者方法是否要在事務環境中運行。(後面會有單獨的文章介紹該屬性)
隔離級別定義了一個事務可能受其餘併發事務影響的程度。多事務併發可能會致使髒讀、幻讀、不可重複讀等各類讀現象。(具體參考:數據庫的讀現象淺析)
ISOLATION_DEFAULT:使用後端數據庫默認的規則
ISOLATION_READ_UNCOMMITTED:容許讀取還沒有提交的數據變動,可能會致使髒讀,幻讀或不可重複讀
ISOLATION_READ_COMMITTED:容許讀取併發事務已經提交的數據,能夠防止髒讀,可是幻讀或不可重複讀仍有可能發生
ISOLATION_REPEATABLE_READ:對贊成字段的屢次讀取結果是一致的,除非數據是被本事務本身所修改,看阻止髒讀和不可重複讀,但幻讀仍有可能發生
ISOLATIOM_SERIALIZABLE:徹底服從ACID的隔離級別,確保阻止髒讀,不可重複讀以及幻讀,這是最慢的數據隔離級別
(具體參考:深刻分析事務的隔離級別)
若是事務只對後端的數據庫進行讀操做,數據庫能夠利用事務ID只讀特性來進行一些特定的優化。經過將事務設置爲只讀,你就能夠給數據庫一個機會,讓他應用它認爲合適的優化措施。由於是否只讀是在事務啓動的時候由數據庫實施的,因此只有對那些具有可能啓動一個新事務的傳播行爲(PROPAGATION_REQUIRED
,PROPAGATION_REQUIRED_NEW
,PROPAGATION_NESTED
)的方法來講,纔有意義。
爲了使應用程序很好地運行,事務不能運行太長時間。由於超時時鐘會在事務開始時啓動,因此只有對那些具有可能啓動一個新事務的傳播行爲(PROPAGATION_REQUIRED
,PROPAGATION_REQUIRED_NEW
,PROPAGATION_NESTED
)的方法來講,纔有意義。
事務回滾規則定義了哪些異常會致使事務回滾而哪些不會。默認狀況下,事務只有在遇到運行時期異常纔回滾,而在遇到檢查型異常時不會回滾。
事務屬性的配置方式經過如下關鍵字來指定:
關鍵字 | 含義 |
---|---|
isolation | 指定事務的隔離級別 |
propagation | 定義事務的傳播規則 |
read-only | 指定事務爲只讀 |
rollback-for no-rollback-for |
rollback-for指定事務對哪些檢查型異常應當回滾而不提交 no-rollback-for指定事務對哪些異常應當繼續執行而不回滾 |
timeout | 對於長時間運行的事務定義超時時間 |
XML中事務屬性的配置方式以下:
<tx:advice id="txAdvice" transactionmanager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" read-only="true"/> </tx:attributes> </tx:advice>
註解中事務屬性的配置方式以下:
@Transaction(propagation=Propagation. REQUIRED,readOnly=true) public void add(String username){ //... }
事務是企業應用開發中很重要的組成部分,他讓軟件變得更加健壯。他保證了全有或全無的操做。
Spring同時支持編碼式和聲明式事務管理,不管使用哪一種方式進行事務管理,都應該知道與事務相關的五個屬性。