Spring事务

Spring事务的隔离级别

就是数据库的4个隔离级别+1个Spring默认隔离级别

  • Spring默认隔离级别:oracle为读已提交,mysql为可重复读
  • 读未提交
  • 读已提交
  • 可重复读
  • 序列化

Spring事务的传播级别

有事务A、B,事务A中调用事务B,A为父事务,B为子事务

传播级别用于修饰B

保证同一个事务中

  • REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
  • SUPPORTS 支持当前事务,如果不存在,就不使用事务
  • MANDATORY 支持当前事务,如果不存在,抛出异常

保证没有在同一个事务中

  • REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
  • NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
  • NEVER 以非事务方式运行,如果有事务存在,抛出异常
  • NESTED 如果当前事务存在,则嵌套事务执行(父事务回滚,子事务一定回滚,但是子事务回滚,不影响父事务回滚)

Spring事务什么时候会失效

  • 自调用

    • 类中调用本类的方法,解决办法:设置为代理类,由代理类来执行
  • 方法不是public

    • @Transactionl(注解方式)只能用于public方法,否则事务会失效
  • 数据库不支持事务

  • 没有交由Spring管理

  • 异常被吃掉,事务不会回滚(或者抛出的异常未被定义,默认为运行时异常)