毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> java技术 >> 正文

spring的声明式事务处理没有回滚rollback

更新时间:2016-3-27:  来源:毕业论文

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource" /> 
        <property name="configLocation" value="classpath:mybatis-config.xml"></property> 
    </bean> 
    
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.yuansheng.abroad" />
    </bean>
    
    <bean id="txManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
        <property name="dataSource" ref="dataSource" /> 
      </bean> 
      <tx:advice id="txAdvice" transaction-manager="txManager"> 
         <tx:attributes> 
              <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/><!-- 支持当前事务,如果执行到add开头的任何方法时没有事务则开启一个事务 这是最常见的方式 -->
              <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
              <tx:method name="register*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
              <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
              <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
              <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
              <tx:method name="change*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
              <tx:method name="toggle*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
              <tx:method name="del*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
              <tx:method name="get*" read-only="true"/>
          </tx:attributes>
       </tx:advice> 
       
       <!--  配置参与事务的类 -->
      <aop:config>
          <aop:pointcut id="txMethod" expression="execution(* com.yuansheng.abroad.service.impl.*.*(..))"  /> 
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txMethod" />
      </aop:config> 

如上所示,项目采用springmvc+mybatis,测试com.yuansheng.abroad.service.impl.InvestServiceImpl.toogleRecommend()方法,主动抛出空指针异常,数据没有回滚。
1,数据表采用的是innoDB引擎,支持事务回滚
2,在DataSourceTransactionManager中的各方法上打断点,getDataSource()执行到了,但doCommit()和doRollback()都没有执行到。

<tx:method name="toggle*" propagation="REQUIRED" rollback-for="java.lang.Exception" />与你service里的实现方法对应不上,你的service方法com.yuansheng.abroad.service.impl.InvestServiceImpl.toogleRecommend()。
toogleRecommend和name="toggle*"这个方法对应不上啊service是toogle,比spring配置文件多了一个o

因为spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。

还有一种方式是将service层改用xml配置,其实这样做也是变相的让springmvc无法扫描service,而只能依赖父窗口也就是ServletContextListener来进行初始化,这样同样被赋予了事务性。

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。