-
作用范围
- 作用接口上,不推荐,因为这只有在使用基于接口的代理时它才会生效
- 作用于类,该类的所有public方法都有相同的事物属性
- 作用于类方法上,只能用于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 大场景"