跳至主要內容

事务

chanchaw大约 1 分钟javaspring

概述

事务传播方式分为七个枚举:

  1. REQUIRED - 默认传播类型,如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务
  2. SUPPORTS - 当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行
  3. MANDATORY - 当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常
  4. REQUIRES_NEW - 创建一个新事务,如果存在当前事务,则挂起该事务
  5. NOT_SUPPORTED - 始终以非事务方式执行,如果当前存在事务,则挂起当前事务
  6. NEVER - 不使用事务,如果当前事务存在,则抛出异常
  7. NESTED - 如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样(开启一个事务)

失效场景

  • 注解使用在非 public 方法上(事务注解要求只能使用在 public 方法上)
  • propagation(传播行为)属性配置错误(不合理)
  • rollbackFor 属性设置错误。默认情况下,注解 @Transactional 只对运行时异常 RuntimeExceptionError 进行回滚,如果想要对所有异常情况都回滚需要显式的指定 @Transactional(rollbackFor = Exception.class)
  • 通过 this 调用同一个类中的方法,没有使用代理对象,导致事务失效
  • 主动 catch 异常(吃掉了异常),导致事务失效
  • 数据库本身不支持,例如mysqlMyISAM 引擎