- 事务的ACID特性:
原子性 atomicity, 一致性 consistency,隔离性 isolation,durability 持久性
undo日志保证A和C
加锁 MVCC等 保证 I
redo日志保证D
- 事务的属性
- 传播行为
枚举类Propagation
注意:requires new这种 如果外部方法A已经有事务,又在内部方法B中新建一个事务的话,A回滚不会影响B,但是B回滚会让A也跟着回滚因为这个异常被 aMethod()的事务管理机制检测到了。
- 隔离级别
枚举类Isolation
MySQL 默认采用的 REPEATABLE_READ 隔离级别 Oracle 默认采用的 READ_COMMITTED 隔离级别.
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
区分不可重复读和幻读
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
- 回滚规则
默认情况:遇到运行时异常,ERROR会回滚,检查型异常(CHECKED)不会
- 是否只读
为什么数据库查询操作需要开启事务?
答:如果读取一条,那无所谓,因为mysql默认保证一条sql查询的读一致性
但是如果读取多条,必须保证整体的读一致性,要开事务
- 事务超时
事务所允许执行的最长时间,超时未完成自动回滚。int值表示,单位是s,默认-1(永不超时)
- @Transaction事务注解原理
@Transactional 的工作机制是基于 AOP 实现的,AOP 又是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理,如果目标对象没有实现了接口,会使用 CGLIB 动态代理。
Spring AOP 自调用问题:(类中的方法调用类自己的另一个方法)
同一个类中,没有 @Transactional 注解的方法内部调用有 @Transactional 注解的方法,有@Transactional 注解的方法的事务会失效
这是由于Spring AOP代理的原因造成的,因为只有当 @Transactional 注解的方法在类以外被调用的时候,Spring 事务管理才生效。
解决办法就是避免同一类中自调用或者使用 AspectJ 取代 Spring AOP 代理**