本地事务

  • 作用范围

  1. 作用接口上,不推荐,因为这只有在使用基于接口的代理时它才会生效
  2. 作用于类,该类的所有public方法都有相同的事物属性
  3. 作用于类方法上,只能用于public方法上,会覆盖类上注解配置
  • 属性

1. propagation
    Propagation.REQUIRED(默认值) // 如果有事务,就加入该事务,如果没有,创建事务
    Propagation.SUPPORTS // 如果有事务,加入该事务,如果没有,不创建事务
    Propagation.MANDATORY // 如果有事务,加入该事务,如果没有,抛异常
    Propagation.REQUIRES_NEW // 不管当前有无事务,重新创建一个新的事务
    Propagation.NOT_SUPPORTED // 如果当前有事务,暂停当前事务,没有也不创建事务
    Propagation.NESTED // 等价于默认值
2. isolation  // 事务的隔离级别,各个数据库厂商对其做了支持
    Isolation.DEFAULT // 使用数据库默认的隔离级别
    Isolation.READ_UNCOMMITTED // 读到未提交的数据
    Isolation.READ_COMMITTED // 读已提交的数据  mysql默认隔离级别
    Isolation.REPEATABLE_READ // 
    Isolation.SERIALIZABLE
3. readOnly 默认值false
    对于不需要事务的方法设置readOnly为true可以提高性能
    例如:spring+hibernate的环境下,spring对只读事务会有特别的优化
4. rollbackFor 指定回滚异常类型
    Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;
    其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。
5. noRollbackFor 指定不回滚的异常类型
  • 特性

1. 原子性(Atomicity)
2. 一致性(Consistency)
3. 隔离性(Isolation)
4. 持久性(Durability)
  • @transactional注解失效情况(即事务没有生效的原因)

1. 事务注解只能作用在public的方法上,非public方法不生效
2. propagation配置为非事务
3. rollbackFor配置错误
4. 外部调用没有声明事务的方法A,A调用本类的方法B,无论B是publilc还是private,或者是否声明事务,这次调用都不会有事务支持,因为事务是基于Spring的AOP代理的,只有当前事务方法被外部代码调用时才会得到事务的支持
5. 代码里面吃了异常
6. 数据库引擎不支持事务 mysql的innodb引擎默认支持事务
7. 没有被事务所在的bean没有被spring管理
  • 参考

[https://mp.weixin.qq.com/s/UnRvGBrMr-hP2Hd2eXqOqQ]: "Spring 事务失效的 8 大场景"

posted @ 2021-02-22 08:28  xdsax  阅读(13)  评论(0编辑  收藏  举报