如果我在Action的execute方法中调用多个xxxService类,其中一个出异常了,我想把所有Service的操作全部回滚,
怎样配置啊?之前<value>*Service</value>是用来切Service的,
现在我改为<value>*Action</value>了,就不能回滚了。
而且我把Service的异常全部都抛给Action了,还是不行。
    <bean id="beanproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <value>*Service</value><!--就改这里啦。。-->
        </property>
        <property name="interceptorNames">
            <list>
                <value>transactionAdvisor</value>
            </list>
        </property>
    </bean>

解决方案 »

  1.   

    兄弟,service层的异常是什么异常?如果用注解去配置事务的话回滚条件是必须是运行时异常!
      

  2.   

    是运行时的异常啊,比如我故意把插入的字符串弄得很长,超过了varchar(20)的范围就报错,或者加int i = 10/0;但是不回滚啊而且我也没再service层用try catch捕获,直接throws Exception给action了。
      

  3.   

    为什么一个Action方法要调多个service? 可以把你Action要完成的业务都放到一个service方法里啊。我们项目就是这么规定的!
      

  4.   

    <!-- AOP -->
    <aop:config>
    <aop:pointcut id="serviceMethods"
    expression="execution(* com.xxx..service.*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
    </aop:config>
      

  5.   

    这个只能切service,不能切action吧。而且我把expression里的表达式改为action的也不行啊。。
      

  6.   

    如果是多个service的话也没有错把。偶公司都是一个action调用多个service的。。
      

  7.   

    把业务代码写在service、spring能解决这个问题
      

  8.   

    你在dao层--》service层--》action从里到外都抛出RunTimeException()试试呢
      

  9.   

    1、这个只能切service,不能切action吧。而且我把expression里的表达式改为action的也不行啊。。你的Action对象的生成是不是交给Spring来管理的???
    2、一个Action调用多个Service,而你的事务管理控制在Service层,当然不能全部回滚啦,把多个Service都封装在一个Service里吧,然后为这个Service添加事务管理
      

  10.   

    10楼正解,你的问题两个解决办法:一、把一个事务里的东西写在一个Service层的方法中(其实你可以在service层写个方法调用多个service,以确保代码重用,然后在action层再调用这个方法);二、整改框架,将Action纳入spring进行管理。
      

  11.   

    二、整改框架,将Action纳入spring进行管理。
    什么做嘛
      

  12.   

          如果你想把事务管理控制在Action层,我建议你不要这样做,不利于以后业务层的重用。一般都控制在业务层
          最好的做法就是把你的几个service封装为一个Service,并为它添加事务管理。
          而且,按照你的情况,Action肯定不是不是Spring管理的,如果你现在把它交给Spring管理,Action层的整个配置和Spring的配置文件都要改,每个Action都要配置,用注解或者XML配置都要改很多,你更加痛苦
      

  13.   

      <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
          <ref local="sessionFactory"/>
        </property>
      </bean>
      <bean id="baseTransactionProxy" name="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
        <property name="transactionManager">
          <ref bean="transactionManager"/>
        </property>
        <property name="transactionAttributes">
          <props>
            <prop key="upload*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="find*">PROPAGATION_REQUIRED</prop>
            <prop key="clear*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="send*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="copy*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="end*">PROPAGATION_REQUIRED,-Exception</prop>
            <prop key="count*">PROPAGATION_REQUIRED</prop>
            <prop key="verify*">PROPAGATION_REQUIRED</prop>
          </props>
        </property>
      </bean>
      <bean id="superviseAmountMgr" class="syhy.modules.office.deal.bslogin.SuperviseAmountMgr">
        <property name="persistOperations">
          <ref bean="persistOperations"/>
        </property>    
     </bean>
      <bean id="superviseAmountMgrProxy" name="superviseAmountMgrProxy" parent="baseTransactionProxy">
        <property name="target">
          <ref local="superviseAmountMgr"/>
        </property>
      </bean>
    注意关键在这 :        <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>