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