上一篇說明了一種spring事務(wù)配置方式,這次補上另一種。
見配置文件:
<!-- 事務(wù)攔截 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" propagation="REQUIRED" read-only="true" />
<tx:method name="search*" propagation="REQUIRED" read-only="true" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="modify*" propagation="REQUIRED" />
<tx:method name="send*" propagation="REQUIRED" />
<tx:method name="revoke*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="logging*" propagation="NOT_SUPPORTED" read-only="true" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="projectServiceOperation" expression="execution(* cn.ceopen.bss..*.service..*(..))" />
<aop:advisor pointcut-ref="projectServiceOperation" advice-ref="txAdvice" />
</aop:config>重點說明兩點:
1.<aop:pointcut id="projectServiceOperation" expression="execution(* cn.ceopen.bss..*.service..*(..))" />
表示你要進(jìn)行事務(wù)控制的類名。詳細(xì)資料可以查下 aspectj語法。
配置完成一定要實際測試一下,我配置過 expression="execution(* cn.ceopen.bss..*.service.*(..))" 少了一個點,導(dǎo)致事務(wù)不起作用。
導(dǎo)致項目很長一段時間事務(wù)方面沒經(jīng)過嚴(yán)格測試。
2.
Spring的AOP事務(wù)管理默認(rèn)是針對unchecked exception回滾。
也就是默認(rèn)對RuntimeException()異常極其子類進(jìn)行事務(wù)回滾。
在項目中定義公共的RuntimeException異常,避免每個開發(fā)人員隨意拋出異常。
不然的話沒新定義一個異常,就要修改tx:method rollback-for 太麻煩了。
總結(jié):
1.對事務(wù)配置進(jìn)行檢查,對復(fù)雜嵌套的事務(wù)邏輯必要的時候debug到spring源碼中確認(rèn)。
2.定義統(tǒng)一異常類型
3.同一個類調(diào)用自身方法,子方法的事務(wù)配置不起作用。解決方法見上一篇文章。
http://www.aygfsteel.com/zyskm/archive/2011/11/11/363535.html作者: zyskm
本文地址:
http://www.aygfsteel.com/zyskm/archive/2011/11/30/365225.html