事务的特性和属性

特性:原子性、一致性、隔离性、持久性

属性:隔离性、传播性、回滚规则、是否只读、超时时间

事务传播行为有哪几种?

协同派:

  1. REQUIRED:有就加入,没有就新建(默认)
  2. SUPPORTS:有就加入,没有就算了
  3. NESTED:有就新建子事务(子事务失败父事务不受影响,父事务失败会带动子事务回滚),没有就新建事务

独立派:

  1. REQUIRES_NEW:直接单独开事务,有事务就挂起(脱离当前事务影响)
  2. NOT_SUPPORTED:以非事务运行,有事务就挂起(脱离当前事务影响)

强硬派:

  1. MANDATORY:有就加入,没有就抛异常
  2. NEVER:有事务就抛异常,没事务就以非事务运行

事务注解失效的场景?

底层使用AOP实现,而AOP又是基于动态实现实现,通过ThreadLocal存储上下文,失效场景就与其原理有关

  1. 最简单的就是异常吞没,使用了try/catch代码捕获异常后未重新抛出,导致事务注解无法感知
  2. 设置的异常范围太小,默认设置是RuntimeException导致捕获不到Exception异常
  3. 类的自调用,同一个类中方法调用,因此事务是基于动态代理实现的,同类的方法调用不会走代理方法
  4. 修饰非 public 方法,Spring 事务管理器判断非公共方法则不应用事务。
  5. 传播机制配置错误,例如使用了REQUIRES_NEW(挂起脱离当前事务)传播行为
  6. 多线程环境,每个线程有自己的ThreadLocal上下文
  7. 使用的数据库不支持事务,如使用MySQL的MyISAM引擎
  8. 修饰final 和 static 方法,aop 默认是 cglib 代理,无法对 final 方法子类化。static 是静态方法,属于类,不属于实例对象,无法被代理!