??? <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
內部每個方法的事務處理,那么在
DAO
層內部最好不要從自己去
catch
異常,因為在
SERVICE
里面可能多次調用
DAO
,一旦多次調用,你其中一個方法捕獲了異常就沒有辦法保證事務回滾,所以即使你捕獲異常為了調試,一定要在
CATCH
方法中一定還要拋出一個異常來,否則無法保證事務
?
2
:
一旦決定要用
spring aop
方式來處理事務,一定要不采用
JDOtemplate
,或者
HIBERNATE TEMPALATE
內部類的方式,因為那樣他們自己去管理事務,一旦在內部類中事務回滾,無法保證其他的
DAO
中事務回滾
?
3
:
1、?
PROPAGATION_REQUIRED --
支持當前的事務,如果不存在就創建一個新的。這是最常用的選擇。
2
、
PROPAGATION_SUPPORTS --
支持當前的事務,如果不存在就不使用事務。
3
、
PROPAGATION_MANDATORY --
支持當前的事務,如果不存在就拋出異常。
4
、
PROPAGATION_REQUIRES_NEW --
創建一個新的事務,并暫停當前的事務(如果存在)。
5
、
PROPAGATION_NOT_SUPPORTED --
不使用事務,并暫停當前的事務(如果存在)。
6
、
PROPAGATION_NEVER --
不使用事務,如果當前存在事務就拋出異常。
7
、
PROPAGATION_NESTED --
如果當前存在事務就作為嵌入事務執行,否則與
PROPAGATION_REQUIRED
類似。
?
?
4
:
<
prop key="change*">PROPAGATION_REQUIRED</prop>
?
你可以在
PROPAGATION_REQUIRE
之后指定拋出什么樣的異常事務才回滾,或者事務的隔離方式是什么等等都可以配置如
<prop key="change*">PROPAGATION_REQUIRED,readOnly,-PetClinicException</prop>
posted on 2006-05-17 17:37
小小程序程序員混口飯吃 閱讀(1285)
評論(0) 編輯 收藏 所屬分類:
java