Spring事务不生效问题汇总

在实际项目开发中,经常会由于配置错误或使用不当,导致spring事务管理不生效。如下总结了几点事务不生效的情况:

1、确认创建的mysql数据库表引擎是InnoDB,MyISAM不支持事务。
2、确认调用的类是由spring容器管理的代理类。
  1. AopUtils.isAopProxy(Object object)
  2. AopUtils.isCglibProxy(Object object) //cglib
  3. AopUtils.isJdkDynamicProxy(Object object) //jdk动态代理
  4. <aop:config proxy-target-class="true" />可强制cglib代理
3、调用的方法必须是public,否则事务不起作用。这一点由Spring的AOP特性决定的。
4、spring切点是否配置错误,或使用了springmvc,可能是context:component-scan重复扫描引起的。
5、抛出一个runtimeException才能回滚,Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的。
Transactional的异常控制,默认是Check Exception 不回滚,unCheck Exception回滚 
如果我想check异常也想回滚怎么办,注解上面写明异常类型即可@Transactional(rollbackFor=Exception.class类似的还有norollbackFor,自定义不回滚的异常。
6、Spring的事务传播策略在内部方法调用时将不起作用。
  1. public int save(String name, int age) throws Exception {
  2. insert(name, age);
  3. return 1;
  4. }
  5. @Transactional
  6. public void insert(String name, int age){
  7. jdbcTemplate.update("insert into user(id,name,age)values(1,'"+name+"',"+age+")");
  8. jdbcTemplate.update("insert into user(id,name,age)values(2,'"+name+"',"+age+")");
  9. }


  10. 还有讲spring内部方法对事务不起作用的文章,见http://lib.csdn.net/article/javaee/10693

  11. Spring事务处理时自我调用的解决方案及一些实现方式的风险:

  12. http://blog.sina.com.cn/s/blog_4adc4b090102wmxv.html

Spring的7种事务传播行为类型: https://blog.csdn.net/hsgao_water/article/details/52860380

Spring3注解事务失效解决方案: http://blog.51cto.com/lxdwolf/1265476


  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值