spring做事务,MySql 事务不起效

zlt原创文章,转载请注明出处,有错希望大家一起交流。。。http://write.blog.csdn.net/postedit


spring做事务,事务不起效


首先 Spring 的配置文件如下:


<!-- 开启事务注解驱动 -->  
    <tx:annotation-driven />  
  
    <!-- 事务管理器 -->  
    <bean name="transactionManager"  
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource"></property>  
    </bean>  
      
      
    <!-- PROPAGATION_SUPPORTS: 如果已经存在事务,则加入事务;如果没有事务,则以非事务的方式执行;   
         PROPAGATION_MANDATOR: 使用当前事务, 如果没有, 则抛出异常;   
         PROPAGATION_REQUIRED: 支持当前事务,如果当前没有事务,就新建一个事务   
         PROPAGATION_REQUIRED_NEW: 新建事务,如果当前有事务, 则挂起;   
         ROPAGATION_NOT_SUPPORTED:以非事务的方式执行, 如果当前有事务, 则挂起;   
         PROPAGATION_NEVER:以非事务的方式执行, 如果当前有事务,则抛出异常;    -->  
    <tx:advice id="txAdvice" transaction-manager="transactionManager">  
        <tx:attributes>  
            <tx:method name="remove*" propagation="REQUIRED" read-only="false"  
                rollback-for="java.lang.RuntimeException,java.lang.Exception" />  
            <tx:method name="create*" propagation="REQUIRED" read-only="false"  
                rollback-for="java.lang.RuntimeException,java.lang.Exception" />  
            <tx:method name="save*" propagation="REQUIRED" read-only="false"  
                rollback-for="java.lang.RuntimeException,java.lang.Exception" />   
            <tx:method name="update*" propagation="REQUIRED" read-only="false"  
                rollback-for="java.lang.RuntimeException,java.lang.Exception" />  
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>  
        </tx:attributes>  
    </tx:advice>  
  
    <aop:config>  
        <aop:pointcut id="pc"  
            expression="execution(横切关注点) /> <!--事务控制在Service层 -->  
        <aop:advisor pointcut-ref="pc" advice-ref="txAdvice" />  
    </aop:config> 


此时,事务不生效的主要原因有以下几点:

前言:首先,MySql支持多种数据库引擎,我们需要主要关注两个数据库引擎,一个是InnoDB,一个是MyISAM


原因一:MySql为了性能,它的表默认使用的是MyISAM数据库引擎,此种引擎是不支持事务的,所以你无论spring怎么管理都不会有事务存在。而且,子通常使用MySql时,我们都是第一选择InnoDB,原因是MyISAM不支持事务,不支持崩溃后的安全恢复,没有行级锁,所以不支持并发操作,当然你如果不需要这些性能可以选择MyISAM,但是需要注意的是不要混合使用数据库引擎,因为这样会存在很多bug或者出莫名奇妙的怪物。.使用alter table table_name engine=innodb;  命令切换表引擎。

如果你原因一是正确的,那么请看原因二:

原因二:spring 配置不对呗,不多赘述。

               特别注意:

               @Transactional 只能被应用到public方法上,对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

                事务回滚是建立在向上抛异常的情况下,如果你进行了异常捕捉而不往上抛的话,也不会让事务生效、

原因三:MySql 默认的一个属性叫  defaultAutoCommit ,好吧,默认提交事务,默认是true,也就是说,你插完或者删完,他就给你提交了事务了。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值