熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

淺析Spring提供的事務管理方法

2013-11-23 20:33:58  來源: Java開源技術 

  Spring提供的事務管理可以分為兩類編程式的和聲明式的編程式的比較靈活但是代碼量大存在重復的代碼比較多而聲明式的比編程式的更靈活方便本文將討論這兩種事務管理的區別

  傳統的JDBC事務管理

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

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

  Connection conn = null;

  try

  {

  conn = DBConnectionFactorygetConnection;

  connsetAutoCommit(false);

  //do something

  mit(); //commit transcation

  }

  catch(Exception e)

  {

  connrollback();

  //do sth

  }

  finally

  {

  try

  {

  connclose();

  }

  catch(SQLException se){ //do sth}

  //close ResultSetPreparedStatementConnection

  //notice:Maybe ocurr Exception when u close rspstmtconn

  }

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

  Spring提供的編程式的事務處理

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

  ?TransactionDefinition //事務屬性定義

  ?TranscationStatus //代表了當前的事務可以提交回滾

  ?PlatformTransactionManager這個是spring提供的用於管理事務的基礎接口其下有一個實現的抽象類AbstractPlatformTransactionManager我們使用的事務管理類例如DataSourceTransactionManager等都是這個類的子類

  我們使用編程式的事務管理流程可能如下

   聲明數據源

   聲明一個事務管理類例如DataSourceTransactionManagerHibernateTransactionMangerJTATransactionManager等

   在我們的代碼中加入事務處理代碼

  TransactionDefinition td = new TransactionDefinition();

  TransactionStatus ts = transactionManagergetTransaction(td);

  try

  {

  //do sth

  trmit(ts);

  }

  catch(Exception e){transactionManagerrollback(ts);}

  使用spring提供的事務模板TransactionTemplate

  void add()

  {

  transactionTemplateexecute( new TransactionCallback(){

  pulic Object doInTransaction(TransactionStatus ts)

  { //do sth}

  }

  }

  TransactionTemplate也是為我們省去了部分事務提交回滾代碼定義事務模板時需注入事務管理對象

  Spring聲明式事務處理

  Spring聲明式事務處理也主要使用了iocaop思想提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean可以直接對組件進行事務代理

  使用TransactionInterceptor步驟

  定義數據源事務管理類

  定義事務攔截器such as:

  <bean id = transactionInterceptor class=orgspringframeworktransactioninterceptorTransactionInterceptor

  <property name=transactionManager><ref bean=transactionManager/></property>

  <property name=transactionAttributeSource

  <value>

  comtestUserManager*r=PROPAGATION_REQUIRED

  </value>

  </property>

  </bean>

  為組件聲明一個代理類ProxyFactoryBean

  <bean id=userManager class=orgspringframeworkaopframeworkProxyFactoryBean

  <property name=proxyInterfaces><value>comtestUserManager</value></property>

  <property name=interceptorNames

  <list>

  <idref local=transactionInterceptor/>

  </list>

  </property>

  </bean>

  使用TransactionProxyFactoryBean:

  <bean id=userManager class=orgspringframeworktransactioninterceptorTransactionProxyFactoryBean

  <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_REQUIREDreadOnly</prop>

  </props>

  </property>

  </bean>

  TransactionProxyFactoryBean只是為組件的事務代理如果我們要給組件添加一些業務方面的驗證等可以使用 TransactionTemplate加攔截器方式為組件添加多個攔截器spring AOP中提供了三類Advice即前增強後增強拋出異常時的增強可以靈活使用


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28680.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.