我是一个spring 学习的初手, 在学习spring in action这本书的 事务自动代理 章节时,按照所说的方式,我先配置了一个自动代理和事务属性源advisor,如下:
<bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
</bean>
<bean id="transactionAdvisor" class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<constructor-arg>
<ref bean="tranInterceptor">
</constructor-arg>
</bean>
<bean id="tranInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"> <ref bean="hibernateTranManager"> </property> <property name="transactionAttributeSource"> <ref bean="tranAttribute1"> </property> </bean>
而后,我配置属性源,书上说有两种方式位自动代理选择一个属性源
一:
<bean id="tranAttribute1" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props>
<prop key="insertPerson">
PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException
</prop>
</props>
</property>
</bean>
在我的测试代码中,事务是可以回滚的,也就是说,-PersonException是起作用的,测试代码我贴上部分
public void insertPerson(final Person p) throws PersonException{
getHibernateTemplate().save(p);
throw new PersonException();
}
但是,当我按照第二种方式配置属性源,则,没有预期的产生事务回滚:
<bean id="tranAttribute2" class="org.springframework.transaction.interceptor.MethodMapTransactionAttributeSource">
<property name="methodMap">
<entry key="com.dao.PersonDao1.insertPerson">
<value>
ROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException
</value>
</entry>
</property>
</bean>
PS:用第二种属性源测试的时候,我上述拦截器tranInterceptor的transactionAttributeSource我换成了tranAttribute2的。
期望达人能帮小弟解决这个学习上的疑惑
谢谢
问题补充:
修正:
一楼指出的问题,最后一个配置代码中
<value>
ROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException
</value>
少了一个P,应该是PROPAGATION_REQUIRES_NEW,而不是 ROPAGATION_REQUIRES_NEW。
谢谢一楼帮忙指出这个错误,这个是我贴代码的时候的失误,源代码中是如下:
<value>
PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException
</value>
特此更正,谢谢