Transaction續四
spring和ejb事務的一個trap是:
事務是加載在方法上,要事務起作用,首先事務所在的類的代理要被攔截,其次是方法要被攔截。
同“transaction續三”類似的一個陷阱,如果事務的方法內部調用的方法是在同一個類里,那么并沒有事務起作用。
<bean id="txAttributes"
class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props>
<prop key="backupXmlToDb">PROPAGATION_NOT_SUPPORTED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props>
<prop key="backupXmlToDb">PROPAGATION_NOT_SUPPORTED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
同樣“PROPAGATION_NOT_SUPPORTED”雖然配置給了backupXmlToDb,但是如果backupXmlToDb是被同一個類(事務攔截)的方法調用,那么這個調用邏輯是:同一個事務中的兩個方法的,這樣是不會起另一個事務的(可查看spring的源代碼)。
解決辦法就是把它放到另一個對象里,讓這個對象的代理被攔截,從而達到預期目的
以前一直有這個理論,但是實踐中卻犯了這個錯誤,害的我浪費了5個小時,真該打。
posted on 2010-09-07 10:37 crazycy 閱讀(244) 評論(0) 編輯 收藏 所屬分類: JavaEE技術