??? <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
??????
? abstract="true">
?????? <property name="transactionManager" ref="transactionManager"/>
?????? <property name="transactionAttributes">
?????????? <props>
????????????? <prop key="insert*">PROPAGATION_REQUIRED</prop>
????????????? <prop key="update*">PROPAGATION_REQUIRED</prop>
????????????? <prop key="delete*">PROPAGATION_REQUIRED</prop>
????????????? <prop key="change*">PROPAGATION_REQUIRED</prop>
????????????? <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
???
?????? </props>
?????? </property>
??? </bean>
1 :
一旦你決定要用
AOP
來做
SERVICE
內(nèi)部每個(gè)方法的事務(wù)處理,那么在
DAO
層內(nèi)部最好不要從自己去
catch
異常,因?yàn)樵?/span>
SERVICE
里面可能多次調(diào)用
DAO
,一旦多次調(diào)用,你其中一個(gè)方法捕獲了異常就沒有辦法保證事務(wù)回滾,所以即使你捕獲異常為了調(diào)試,一定要在
CATCH
方法中一定還要拋出一個(gè)異常來,否則無法保證事務(wù)
2 :
一旦決定要用 spring aop 方式來處理事務(wù),一定要不采用 JDOtemplate ,或者 HIBERNATE TEMPALATE 內(nèi)部類的方式,因?yàn)槟菢铀麄冏约喝ス芾硎聞?wù),一旦在內(nèi)部類中事務(wù)回滾,無法保證其他的 DAO 中事務(wù)回滾
3 :
1、?
PROPAGATION_REQUIRED --
支持當(dāng)前的事務(wù),如果不存在就創(chuàng)建一個(gè)新的。這是最常用的選擇。
2
、
PROPAGATION_SUPPORTS --
支持當(dāng)前的事務(wù),如果不存在就不使用事務(wù)。
3
、
PROPAGATION_MANDATORY --
支持當(dāng)前的事務(wù),如果不存在就拋出異常。
4
、
PROPAGATION_REQUIRES_NEW --
創(chuàng)建一個(gè)新的事務(wù),并暫停當(dāng)前的事務(wù)(如果存在)。
5
、
PROPAGATION_NOT_SUPPORTED --
不使用事務(wù),并暫停當(dāng)前的事務(wù)(如果存在)。
6
、
PROPAGATION_NEVER --
不使用事務(wù),如果當(dāng)前存在事務(wù)就拋出異常。
7
、
PROPAGATION_NESTED --
如果當(dāng)前存在事務(wù)就作為嵌入事務(wù)執(zhí)行,否則與
PROPAGATION_REQUIRED
類似。
4 : < prop key="change*">PROPAGATION_REQUIRED</prop>
? 你可以在 PROPAGATION_REQUIRE 之后指定拋出什么樣的異常事務(wù)才回滾,或者事務(wù)的隔離方式是什么等等都可以配置如 <prop key="change*">PROPAGATION_REQUIRED,readOnly,-PetClinicException</prop>