Spring的事務管理機制

Spring對事務管理的支持

與EJB相似,Spring提供了對編碼式聲明式事務管理的支持。可是,Spring對事務管理的能力遠遠超過EJB。這裏就不詳細介紹編碼式事務和聲明式事務的區別了。有興趣的讀者能夠自行Google。java

Spring對事務管理是經過事務管理器來實現的。Spring提供了許多內置事務管理器實現:spring

事務管理器
(org.springframework.*)
使用場景
DataSourceTransactionManager 數據源事務管理器,提供對單個javax.sql.DataSource事務管理,用於Spring JDBC抽象框架、iBATIS或MyBatis框架的事務管理;
JdoTransactionManager 提供對單個javax.jdo.PersistenceManagerFactory事務管理,用於集成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+應用服務器事務管理器的適配器,此適配器用於對應用服務器提供的高級事務的支持。

transaction-managers

以上就是Spring中支持使用的事務管理器,通常咱們比較經常使用的就是HibernateTransactionManagerDataSourceTransactionManager。咱們在使用事務的時候要聲明要使用哪一種事務管理器。如:sql

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

事務屬性

spring中,聲明事務是經過事務屬性來定義的。事務屬性描述了事務策略如何應用到方法上事務屬性包含5個方面:數據庫

傳播行爲後端

隔離級別服務器

回滾規則併發

事務超時框架

是否只讀分佈式

transaction-property

這裏簡單介紹一下這五個屬性。優化

傳播行爲

傳播行爲定義了客戶端與被調用方法之間的事務邊界,即傳播規則回答了這樣的一個問題,新的事務應該被啓動仍是掛起,或者方法是否要在事務環境中運行。(後面會有單獨的文章介紹該屬性)

隔離級別

隔離級別定義了一個事務可能受其餘併發事務影響的程度。多事務併發可能會致使髒讀、幻讀、不可重複讀等各類讀現象。(具體參考:數據庫的讀現象淺析)

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同時支持編碼式和聲明式事務管理,不管使用哪一種方式進行事務管理,都應該知道與事務相關的五個屬性。

相關文章
相關標籤/搜索