zhang00001 2008-08-14 17:46
浏览 266
已采纳

Spring 自动代理事务 中碰到了事务无法回滚的问题


我是一个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>



特此更正,谢谢
  • 写回答

3条回答 默认 最新

  • iteye_14762 2008-08-15 12:01
    关注

    请问
    [code="java"]
    com.dao.PersonDao1.insertPerson
    [/code]
    中的PersonDao1是实现类还是接口?这里应该使用接口!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 adb连接不到手机是怎么回事?
  • ¥15 vs2022无法联网
  • ¥15 TCP的客户端和服务器的互联
  • ¥15 VB.NET操作免驱摄像头
  • ¥15 笔记本上移动热点开关状态查询
  • ¥85 类鸟群Boids——仿真鸟群避障的相关问题
  • ¥15 CFEDEM自带算例错误,如何解决?
  • ¥15 有没有会使用flac3d软件的家人
  • ¥20 360摄像头无法解绑使用,请教解绑当前账号绑定问题,
  • ¥15 docker实践项目