spring提供的事務管理

spring提供的事務管理
      spring提供的事務管理可以分爲兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重複的代碼比較多;聲明式的比編程式的更靈活。
 
傳統使用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)
{
    conn.rollback();
    //do sth
}
finally
{
     try
     {
         conn.close();
     }
     catch(SQLException se){ //do sth.}
     //close ResultSet,PreparedStatement,Connection
    //notice:Maybe ocurr Exception when u close rs,pstmt,conn
}
 
按照以往的思路來寫代碼,代碼量比較長,而且容易疏忽,忘掉一些try/catch,引發一些異常無法catch,雖然有時候我們會寫DBTool類,來關閉這些資源,並且保證在關閉這些資源時,不向外拋異常。
 
spring提供的編程式的事務處理
 ==================
spring提供了幾個關於事務處理的類: TransactionDefinition //事務屬性定義
TranscationStatus //代表了當前的事務,可以提交,回滾。
PlatformTransactionManager這個是spring提供的用於管理事務的基礎接口,其下有一個實現的抽象類AbstractPlatformTransactionManager,我們使用的事務管理類例如DataSourceTransactionManager等都是這個類的子類。
 
我們使用編程式的事務管理流程可能如下:
1 聲明數據源
2 聲明一個事務管理類,例如DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等
3 在我們的代碼中加入事務處理代碼:
TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try
{ //do sth
  transactionManager.commit(ts);
}
catch(Exception e){transactionManager.rollback(ts);}
 
使用spring提供的事務模板TransactionTemplate
void add()
{
    transactionTemplate.execute( new TransactionCallback(){
        pulic Object doInTransaction(TransactionStatus ts)
       { //do sth}
    }
}
TransactionTemplate也是爲我們省去了部分事務提交、回滾代碼;定義事務模板時,需注入事務管理對象.
 
spring聲明式事務處理
=============
spring聲明式事務處理也主要使用了ioc,aop思想,提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對組件進行事務代理。
 
使用TransactionInterceptor步驟
1.定義數據源,事務管理類
2.定義事務攔截器,such as:
<bean id = "transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
  <property name="transactionManager"><ref bean="transactionManager"/></property>
  <property name="transactionAttributeSource">
   <value>
        com.test.UserManager.*r=PROPAGATION_REQUIRED
    </value>
  </property>
</bean>
3.爲組件聲明一個代理類:ProxyFactoryBean
<bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean">
      <property name="proxyInterfaces"><value>com.test.UserManager</value></property>
      <property name="interceptorNames">
         <list>
            <idref local="transactionInterceptor"/>
         </list>
      </property>
 </bean>
 
使用TransactionProxyFactoryBean:
<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager"><ref bean="transactionManager"/></property>
  <property name="target"><ref local="userManagerTarget"/></property>
  <property name="transactionAttributes">
   <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
 </bean>
 
TransactionProxyFactoryBean只是爲組件的事務代理,如果我們要給組件添加一些業務方面的驗證等,可以使用TransactionTemplate加攔截器方式,爲組件添加多個攔截器,spring AOP中提供了三類Advice,即前增強,後增強,拋出異常時的增強,可以靈活使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章