一、AOP事務的含義:
事務當作一個切面,動態地織入到目標對象,形成一個代理對象。
二、Spring的事務機制
Spring支持聲明式事務。
Spring使用事務服務代理和事務管理器(如HibernateTransactionManager)來支持事務服務。
Spring對事務的邊界多了一種嵌套事務(PROPAGATION_NESTED)。
PROPAGATION_NESTED:
如果客戶端啓動了事務T1,那麼Bean啓動一個嵌套在T1中的子事務T2;
如果客戶端沒有啓動事務,那麼Bean會啓動一個新的事務,類似於REQUIRED_NEW
三、Spring中事務的使用
1、Spring中使用Hibernate事務
Step1:配置數據源
Step2:配置sessionfactory (同上)
Step3:配置事務管理器
<bean id="myTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="mySessionFactory" />
</property>
</bean>
Step4:創建事務服務代理
<bean id="saleService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<value>lab7.SaleService</value>
</property>
<property name="transactionManager">
<ref bean="myTransactionManager" />
</property>
<property name="target">
<ref bean="saleServiceTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
事務屬性描述格式:
傳播行爲,隔離級別,只讀事務(read-only),回滾規則
在默認情況下,Spring的容器對於非受查異常(服務模塊中拋出的非受查異常),會回滾事務。對於受查異常,會提交事務。
如果即使發生了某種受查異常,也要回滾事務,可以用 “- 異常類型“來聲明。同樣,對於非受查異常,如果不要求回滾事務,可以用"+異常類型"來聲明。
如何簡化事務配置?
使用繼承(抽象的Service類)、自動代理。
四、Spring事務與EJB事務
1、EJB事務:
EJB的CMT管理事務方式,只能設置事務邊界(傳播行爲),對於隔離性是不能設置的,並且EJB不支持嵌套事務。
2、Spring事務:
對於Spring來說, Spring的聲明式事務可以設置事務邊界(傳播行爲),設置隔離級別,設置只讀事務,回滾規則(+:對於任何異常都提交,-:對於任何異常都回滾)
<property name=”transactionAttributes”>
<props>
<prop key=”*”>+異常類型1,-異常類型2</prop>
</property>
PS:Spring對嵌套事務的支持依賴與數據庫底層對嵌套式事務的支持。