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){?
conn.rollback();?
}?
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類,來關閉這些資源,并且保證在關閉這些資源時,不向外拋異常,但是這樣做會導致額外的麻煩。?
2、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也是為我們省去了部分事務提交、回滾代碼;定義事務模板時,需注入事務管理對象。?
3、Spring聲明式事務處理?
Spring聲明式事務處理也主要使用了IoC,AOP思想,提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對組件進行事務代理。?
使用TransactionInterceptor的步驟:?
(1)定義數據源,事務管理類?
(2)定義事務攔截器,例如:?
<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,即前增強,后增強,拋出異常時的增強,可以靈活使用。
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){?
conn.rollback();?
}?
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類,來關閉這些資源,并且保證在關閉這些資源時,不向外拋異常,但是這樣做會導致額外的麻煩。?
2、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也是為我們省去了部分事務提交、回滾代碼;定義事務模板時,需注入事務管理對象。?
3、Spring聲明式事務處理?
Spring聲明式事務處理也主要使用了IoC,AOP思想,提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對組件進行事務代理。?
使用TransactionInterceptor的步驟:?
(1)定義數據源,事務管理類?
(2)定義事務攔截器,例如:?
<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,即前增強,后增強,拋出異常時的增強,可以靈活使用。