Spring学习笔记之事务

128 阅读2分钟

概念

事务是逻辑上的一组操作,要么都执行,要么都不执行。

Spring中事务能够生效,要看数据库是否支持事务。如MySQL如果用InnoDB引擎的话就可以,用MyIsam就不太行。

事务的特性ACID这个概念再数据库中也提到过。

Spring支持两种方式的事务管理

编程式事务管理

通过TransactionTemplate或者TransactionManager写代码管理事务。就用这两个的对象调用对应的事务执行的方法。

声明式事务管理

通过AOP实现,具体来说通过@Transactional注解方式实现的最多,代码侵入性最小。

基于接口而非实现编程,Spring中事务管理有三个重要的接口:

以下图片来自juejin.cn/post/684490…

image.png

(一)Manager中有不同的实现,如JDBC的实现、Hibernate的实现等。

(二)事务属性包含了5个方面:隔离级别、传播行为、回滚规则、是否只读、事务超时。

(三)事务运行过程中的一些状态,定义一下。

事务传播行为(类型)

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。方法可能在现有事务中继续运行,也可能开启一个新的事务,并在新事务中运行。A有事务方法,调用B的事务方法。

(一)PROPAGATION_REQUIRED

A和B一个事务,一起回滚。

image.png

(二)PROPAGATION_REQUIRES_NEW

image.png

image.png

事务隔离级别(隔离性)

image.png

MySQL InnoDB 的 REPEATABLE-READ(可重读)可以一定程度上防止幻读,但并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁读使用到的机制就是 Next-Key Locks。

@Transactional使用

使用范围:方法、类、接口。推荐使用在方法上,但只能应用到public上,否则不生效(AOP决定??)

常用属性

image.png

@Transactional原理

通过AOP实现,而AOP又通过代理实现。如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理??如果目标对象没有实现了接口,会使用 CGLIB 动态代理。

image.png

@Transactional方法自调用问题

image.png

image.png