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条)

报告相同问题?

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法