概念
事务是逻辑上的一组操作,要么都执行,要么都不执行。
Spring中事务能够生效,要看数据库是否支持事务。如MySQL如果用InnoDB引擎的话就可以,用MyIsam就不太行。
事务的特性ACID这个概念再数据库中也提到过。
Spring支持两种方式的事务管理
编程式事务管理
通过TransactionTemplate或者TransactionManager写代码管理事务。就用这两个的对象调用对应的事务执行的方法。
声明式事务管理
通过AOP实现,具体来说通过@Transactional注解方式实现的最多,代码侵入性最小。
基于接口而非实现编程,Spring中事务管理有三个重要的接口:
以下图片来自juejin.cn/post/684490…
(一)Manager中有不同的实现,如JDBC的实现、Hibernate的实现等。
(二)事务属性包含了5个方面:隔离级别、传播行为、回滚规则、是否只读、事务超时。
(三)事务运行过程中的一些状态,定义一下。
事务传播行为(类型)
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。方法可能在现有事务中继续运行,也可能开启一个新的事务,并在新事务中运行。A有事务方法,调用B的事务方法。
(一)PROPAGATION_REQUIRED
A和B一个事务,一起回滚。
(二)PROPAGATION_REQUIRES_NEW
事务隔离级别(隔离性)
MySQL InnoDB 的 REPEATABLE-READ(可重读)可以一定程度上防止幻读,但并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁读使用到的机制就是 Next-Key Locks。
@Transactional使用
使用范围:方法、类、接口。推荐使用在方法上,但只能应用到public上,否则不生效(AOP决定??)
常用属性
@Transactional原理
通过AOP实现,而AOP又通过代理实现。如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理??如果目标对象没有实现了接口,会使用 CGLIB 动态代理。