我是一个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>
特此更正,谢谢