Spring 的事务
事务的特性和属性
特性:原子性、一致性、隔离性、持久性
属性:隔离性、传播性、回滚规则、是否只读、超时时间
事务传播行为有哪几种?
协同派:
- REQUIRED:有就加入,没有就新建(默认)
- SUPPORTS:有就加入,没有就算了
- NESTED:有就新建子事务(子事务失败父事务不受影响,父事务失败会带动子事务回滚),没有就新建事务
独立派:
- REQUIRES_NEW:直接单独开事务,有事务就挂起(脱离当前事务影响)
- NOT_SUPPORTED:以非事务运行,有事务就挂起(脱离当前事务影响)
强硬派:
- MANDATORY:有就加入,没有就抛异常
- NEVER:有事务就抛异常,没事务就以非事务运行
事务注解失效的场景?
底层使用AOP实现,而AOP又是基于动态实现实现,通过ThreadLocal存储上下文,失效场景就与其原理有关
- 最简单的就是异常吞没,使用了try/catch代码捕获异常后未重新抛出,导致事务注解无法感知
- 设置的异常范围太小,默认设置是RuntimeException导致捕获不到Exception异常
- 类的自调用,同一个类中方法调用,因此事务是基于动态代理实现的,同类的方法调用不会走代理方法
- 修饰非 public 方法,Spring 事务管理器判断非公共方法则不应用事务。
- 传播机制配置错误,例如使用了REQUIRES_NEW(挂起脱离当前事务)传播行为
- 多线程环境,每个线程有自己的ThreadLocal上下文
- 使用的数据库不支持事务,如使用MySQL的MyISAM引擎
- 修饰final 和 static 方法,aop 默认是 cglib 代理,无法对 final 方法子类化。static 是静态方法,属于类,不属于实例对象,无法被代理!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Bob's Blog!




