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