spring的事務管理有幾種方式實現,如何實現


Spring框架簡介

Spring框架是一個2003年2月纔出現的開源項目,該開源項目起源自Rod Johnson在2002年末出版的《Expert One-on-One J2EE Design and Development》一書中的基礎性代碼。在該書中,Rod Johnson倡導J2EE實用主義的設計思想,而Spring框架正是這一思想的更全面和具體的實現。Spring框架由一個容器,一個配置和組織組件 的框架,和一組內置的爲事務、持久化和Web用戶接口提供的服務組成。作爲一種輕量級的J2EE框架,Spring提供了一種有效的方式來建立和組織 J2EE應用程序。

Spring特性

IoC(Inversion of Control;控制反轉);又稱DI(Dependency Injection;依賴注入);是面向對象領域新興的編程思想;也是Spring的精髓所在。簡單地說;IoC就是指程序之間的關係由容器來控制;而不 是傳統實現中由程序代碼直接操控。這也就是所謂“控制反轉”的概念所在:控制權由應用代碼轉到外部容器,控制權的轉移,也就是所謂的反轉。IoC將控制創 建的職責搬進了框架中;並把它從應用代碼脫離開來。當使用Spring的IoC容器時只需指出組件需要的對象,在運行時Spring的IoC容器會根據 XML配置數據提供給它。

Spring IoC,藉助於依賴注入設計模式,使得開發者不用理會對象自身的生命週期及其關係,而且能夠改善開發者對模式的使用。對於一個對象的管理不是什麼困難,難 就難在對整個對象羣的管理。依賴注入可以讓容器管理對象,即“Don’t call me, I will call you”。這樣對象本身的生命週期以及對象之間的關係就不再讓開發者費神了。

Spring AOP,藉助於Spring實現攔截器,開發者能夠實現以聲名方式使用企業級服務,比如安全性服務、事務服務。AOP 合理的補充了OOP,藉助於Spring AOP,開發者能夠高效的使用J2EE服務。

Spring服務抽象,藉助於各種J2EE API抽象,使得開發者能夠一致地使用J2EE 技術,而不管具體是使用什麼J2EE API,藉助於Spring服務抽象,使代碼大大減少,滿足“更少代碼,更少BUG”的軟件設計原則。

Spring IoC+Spring AOP+Spring服務抽象,一起形成Spring,這樣一個有機體,使構建輕量級J2EE成爲可能。

Spring事務管理

Spring事務管理可以分爲兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重複的代碼比較多;聲明式的比編程式的更靈活方便。

1.傳統使用JDBC的事務管理

以往使用JDBC進行數據操作,使用DataSource,從數據源中得到Connection,我們知道數據源是線程安全的,而連接不是線程安全 的,所以對每個請求都是從數據源中重新取出一個連接。一般的數據源由容器進行管理,包括連接池。例如TOMCAT,WEBSPHERE,WEBLOGIC 等這些J2EE商業容器都提供了這個功能。

以往的我們使用JDBC在寫代碼時,事務管理可能會是這樣:

Connection conn = null;  

try{  

 conn = DBConnectionFactory.getConnection;  

 conn.setAutoCommit(false);  

 //do something  

 conn.commit(); //commit transcation  

}catch(Exception e)  

finally catch(SQLException se){ //do sth.}  

 //close ResultSet,PreparedStatement,Connection   

 //notice:Maybe ocurr Exception when u close rs,pstmt,conn  

}

按照以往的思路來寫代碼,代碼量比較長,而且容易疏忽,忘掉一些try/catch,引發一些異常無法catch,雖然有時候我們會寫DBTool類,來關閉這些資源,並且保證在關閉這些資源時,不向外拋異常,但是這樣做會導致額外的麻煩。

2.Spring事務管理提供的編程式

Spring提供了幾個關於事務處理的類:

TransactionDefinition //事務屬性定義

TranscationStatus //代表了當前的事務,可以提交


Spring+Hibernate的實質:
就是把Hibernate用到的數據源Datasource,Hibernate的SessionFactory實例,事務管理器HibernateTransactionManager,都交給Spring管理。

那麼再沒整合之前Hibernate是如何實現事務管理的呢?
通過ServletFilter實現數據庫事務的管理,這樣就避免了在數據庫操作中每次都要進行數據庫事務處理。

一.事務的4個特性:
   原子性:一個事務中所有對數據庫的操作是一個不可分割的操作序列,要麼全做,要麼全部做。
   一致性:數據不會因爲事務的執行而遭到破壞。
   隔離性:一個事務的執行,不受其他事務(進程)的干擾。既併發執行的個事務之間互不干擾。
   持久性:一個事務一旦提交,它對數據庫的改變將是永久的。

二.事務的實現方式:
實現方式共有兩種:編碼方式;聲明式事務管理方式。

基於AOP技術實現的聲明式事務管理,實質就是:在方法執行前後進行攔截,然後在目標方法開始之前創建並加入事務,執行完目標方法後根據執行情況提交或回滾事務。

聲明式事務管理又有兩種方式:基於XML配置文件的方式;另一個是在業務方法上進行@Transactional註解,將事務規則應用到業務邏輯中。

三.創建事務的時機:

是否需要創建事務,是由事務傳播行爲控制的。讀數據不需要或只爲其指定只讀事務,而數據的插入,修改,刪除就需要事務管理了。

一種常見的事務管理配置:事務攔截器TransactionInterceptor和事務自動代理BeanNameAutoProxyCreator相結合的方式

<!--定義Hibernate的事務管理器HibernateTransactionManager -->
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <!-- 依賴注入上面定義的sessionFactory -->
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
<!--定義Spring的事務攔截器TransactionInterceptor -->
    <bean id="transactionInterceptor"      class="org.springframework.transaction.interceptor.TransactionInterceptor">
	    <!--  依賴注入上面定義的事務管理器transactionManager -->
        <property name="transactionManager" ref="transactionManager"/>
      	<!-- 定義需要進行事務攔截的方法及所採用的事務控制類型 -->    	
    	<property name="transactionAttributes">		    
		    <props>
			    <!-- 以browse、list、load、get及is開頭的所有方法採用只讀型事務控制類型 -->
			    <prop key="browse*">PROPAGATION_REQUIRED,readOnly</prop>
			    <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>
			    <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
			    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
			    <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
			    <!-- 所有方法均進行事務控制,如果當前沒有事務,則新建一個事務 -->
		    	<prop key="*">PROPAGATION_REQUIRED</prop>
		    </props>
	    </property>
	</bean>
<!-- 定義BeanNameAutoProxyCreatorf進行Spring的事務處理-->
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
	    <!--  針對指定的bean自動生成業務代理 -->
	    <property name="beanNames"> 
            <list>
                <value>adminService</value>
                <value>columnsService</value>
                <value>newsService</value>
                <value>crawlService</value>
                <value>memberLevelService</value>
                <value>memberService</value>
                <value>categoryService</value>
                <value>merService</value>
                <value>cartService</value>
                <value>ordersService</value>
                <value>trafficService</value>
            </list>
	    </property>
	    <!--  這個屬性爲true時,表示被代理的是目標類本身而不是目標類的接口 -->
	    <property name="proxyTargetClass">
	    	<value>true</value>
	    </property>
       <!--  依賴注入上面定義的事務攔截器transactionInterceptor -->
        <property name="interceptorNames">
            <list>
                <value>transactionInterceptor</value> 
            </list>
        </property>
    </bean>	
尤其注意:如下
*****************************************************************************************
【以上的事務攔截器和事務自動代理方式實現原理:像Struts2一樣,都是憑藉強大的攔截器功能對業
務邏輯方法的調用進行攔截,然後又BeanNameAutoProxyCreator自動生成事務代理,最後送事務管理
器,統一管理】
*****************************************************************************************


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章