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>
同样“PROPAGATION_NOT_SUPPORTED”虽然配置给了backupXmlToDb,但是如果backupXmlToDb是被同一个类(事务拦截)的方法调用,那么这个调用逻辑是:同一个事务中的两个方法的,这样是不会起另一个事务的(可查看spring的源代码)。
解决办法就是把它放到另一个对象里,让这个对象的代理被拦截,从而达到预期目的
以前一直有这个理论,但是实践中却犯了这个错误,害的我浪费了5个小时,真该打。