Spring事务不生效问题汇总

转自:http://blog.csdn.net/zhu_tianwei/article/details/72848654

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

1、确认创建的mysql数据库表引擎是InnoDB,MyISAM不支持事务。

2、确认调用的类是由spring容器管理的代理类。

AopUtils.isAopProxy(Object object)
AopUtils.isCglibProxy(Object object) //cglib
AopUtils.isJdkDynamicProxy(Object object) //jdk动态代理
<aop:config proxy-target-class="true" />可强制cglib代理

3、调用的方法必须是public,否则事务不起作用。这一点由Spring的AOP特性决定的。

4、spring切点是否配置错误,或使用了springmvc,可能是context:component-scan重复扫描引起的。

5、抛出一个runtimeException才能回滚。
Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的。
Java异常之checked与unchecked:http://www.cnblogs.com/shihuc/p/5201905.html
Exception这个父类是checked类型,但是其子类RuntimeException (子类NullPointerException等)是unchecked的。

checked与unchecked在throwable中的继承关系

6、Spring的事务传播策略在内部方法调用时将不起作用。

public int save(String name, int age) throws Exception {
        insert(name, age);
        return 1;
    }
    @Transactional
    public void insert(String name, int age){
        jdbcTemplate.update("insert into user(id,name,age)values(1,'"+name+"',"+age+")");
        jdbcTemplate.update("insert into user(id,name,age)values(2,'"+name+"',"+age+")");
        jdbcTemplate.update("insert into user(id,name,age)values(1,'"+name+"',"+age+")");
    }

Spring事务的传播机制:
Propagation支持7种不同的传播机制:
REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。
NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。
REQUIRESNEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常
NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 事务的嵌套概念 所谓事务的嵌套就是两个事务方法之间相互调用。spring事务开启 ,或者是基于接口的或者是基于类的...
    jackcooper阅读 5,254评论 0 10
  • 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。Spring Framewo...
    沉默羔羊121阅读 4,755评论 0 0
  • 1 事务 1.1 事务管理方式 spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务管理使用Tra...
    鑫奕航阅读 7,792评论 0 1
  • spring,mybatis事务管理配置与@Transactional注解使用 概述 事务管理对于企业应用来说是至...
    tenlee阅读 9,650评论 0 11
  • 事务的嵌套概念 所谓事务的嵌套就是两个事务方法之间相互调用。spring事务开启 ,或者是基于接口的或者是基于类的...
    pigstomachs阅读 4,613评论 0 1