spring和ejb事務(wù)的一個(gè)trap是:
事務(wù)是加載在方法上,要事務(wù)起作用,首先事務(wù)所在的類(lèi)的代理要被攔截,其次是方法要被攔截。
同“transaction續(xù)三”類(lèi)似的一個(gè)陷阱,如果事務(wù)的方法內(nèi)部調(diào)用的方法是在同一個(gè)類(lèi)里,那么并沒(méi)有事務(wù)起作用。
<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>
同樣“PROPAGATION_NOT_SUPPORTED”雖然配置給了backupXmlToDb,但是如果backupXmlToDb是被同一個(gè)類(lèi)(事務(wù)攔截)的方法調(diào)用,那么這個(gè)調(diào)用邏輯是:同一個(gè)事務(wù)中的兩個(gè)方法的,這樣是不會(huì)起另一個(gè)事務(wù)的(可查看spring的源代碼)。
解決辦法就是把它放到另一個(gè)對(duì)象里,讓這個(gè)對(duì)象的代理被攔截,從而達(dá)到預(yù)期目的
以前一直有這個(gè)理論,但是實(shí)踐中卻犯了這個(gè)錯(cuò)誤,害的我浪費(fèi)了5個(gè)小時(shí),真該打。