Spring 事務(wù)管理
Spring提供的事務(wù)管理可以分為兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重復(fù)的代碼比較多;聲明式的比編程式的更靈活方便。
Spring提供的編程式的事務(wù)處理
Spring提供了幾個關(guān)于事務(wù)處理的類:
TransactionDefinition //事務(wù)屬性定義
TranscationStatus //代表了當前的事務(wù),可以提交,回滾。
TransactionTemplate//Spring提供的事務(wù)模板
PlatformTransactionManager這個是spring提供的用于管理事務(wù)的基礎(chǔ)接口,其下有一個實現(xiàn)的抽象類AbstractPlatformTransactionManager,我們使用的事務(wù)管理類例如DataSourceTransactionManager等都是這個類的子類。
我們使用編程式的事務(wù)管理流程可能如下:
(1) 聲明數(shù)據(jù)源。
(2) 聲明一個事務(wù)管理類,例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等
(3) 在我們的代碼中加入事務(wù)處理代碼:
TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try{
//do sth transactionManager.commit(ts);
}catch(Exception e){transactionManager.rollback(ts);
}
使用Spring提供的事務(wù)模板TransactionTemplate:
void add(){
transactionTemplate.execute( new TransactionCallback(){
public Object doInTransaction(TransactionStatus ts){
//do sth}
}}
TransactionTemplate也是為我們省去了部分事務(wù)提交、回滾代碼;定義事務(wù)模板時,需注入事務(wù)管理對象。
Spring提供的聲明式事務(wù)處理
Spring聲明式事務(wù)處理也主要使用了IoC,AOP思想,提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對組件進行事務(wù)代理。
使用TransactionInterceptor的步驟:
?。?/span>1)定義數(shù)據(jù)源,事務(wù)管理類
(2)定義事務(wù)攔截器,例如:
<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只是為組件的事務(wù)代理,如果我們要給組件添加一些業(yè)務(wù)方面的驗證等,可以使用TransactionTemplate加攔截器方式,為組件添加多個攔截器,spring AOP中提供了三類Advice,即前增強,后增強,拋出異常時的增強,可以靈活使用。