Spring事务的ACID
事务的ACID分别指的是原子性、一致性、隔离性、持久性,spring事务中定义了如下属性用于实现事务的ACID特性
- 事务名称
- 隔离级别(4种)
- ISOLATION_READ_UNCOMMITTED:运行B事务看到A事务未提交的数据,会造成脏读、不可重复读和幻像读。
- ISOLATION_READ_COMMITTED:事务B只能看到其他事务已提交后的数据状态,解决的了脏读,会造成不可重复读+幻读
- ISOLATION_REPEATABLE_READ:该级别解决了脏读、不可重复读,但是存在幻读,其解决不可重复读的原理如下:
- select … from :该Repeatable-read的算法处理中,在同一个事物内多次读取,则取第一次读取时建立的快照版本
- ISOLATION_SERIALIZABLE:这是事务的最高隔离级别,底层实现是通过对每一行读取的数据加共享锁(Lock in Share Mode)实现,容易造成事务超时与锁竞争
- 超时时间
- 是否只读(ReadOnly)
- 传播机制(7种)
- REQUIRED:存在事务则加入,不存在则新建
- SUPPORT:存在事务则加入,不存在则以非事务执行
- MANDATIORY:存在事务则加入,不存在则抛出异常
- REQUIRES_NEW:存在事务则挂起,新建一个事务执行处理
- NOT_SUPPORTED:存在事务则挂起,以非事务执行,
- NEVER:存在事务则抛出异常
- NESTED:存在则嵌套,不存在则创建新的事务
- 回滚机制
Spring事务的应用
在默认的数据库事务中,每执行一次数据库操作都封装在一个事务中,若操作成功则提交事务,若失败则回滚,类似于使用jdbc编程中的获取到Connection后,执行connection.setAutoCommit(false);在执行完毕后进行connection.commit();
Springboot中开启的方式为在启动类中引入注解@EnableTransactionManagement,用于配置申明式事务
@SpringBootApplication
@EnableTransactionManagement //开启spring事务
public class DmUtilsApplication {
public static void main(String[] args) {
SpringApplication.run(DmUtilsApplication.class,args);
}
}