目录标题

  • Spring 框架的事务处理
  • 事务的基本概念
  • 事务的特性[ACID]
  • Spring 框架 事务平台
  • ①事务的传播性 [Propagation]
  • ②事务的隔离性 [isolation]
  • ③事务的只读性
  • ④事务的超时性
  • ⑤事务的回滚性
  • PlatformTransactionManager 接口
  • TransactionStatus 接口
  • SavepointManager 接口
  • Spring 申明式事务的使用
  • 开发步骤






Spring 框架的事务处理

Spring框架的核心:

  1. IOC 技术 【必需】,它的目的是对象的自动注入
  2. AOP 【可选】, 它的目的是代码增强

注:Spring框架的事务管理是基于AOP机制,它支持两种:

  1. 编程式事务操作 【使用不多,因为它是侵入式的】
  2. 申明式事务操作【使用较多,是基于AOP的】




事务的基本概念

什么是事务【transaction]?

通俗来讲,就是一组相关的操作,如果是数据库事务,就是一组相关的SQL操作,它们要么一起成功,要么一起失败。




事务的特性[ACID]

  1. 原子性, Atomic, 指的是事务不可分割性
  2. 一致性,Consistency, 当事务结束后,内存数据与底层数据是完全一致的。
  3. 隔离性,Isolation,多个事务之间是互相隔离的。
  4. 持久层,Durability, 当事务正确提交后,数据永不丢失。

如果是数据库事务的话,则目前所有主流的数据库产品都是支持事务的,也就是说,它们都遵守以上4个特性。

注:Spring框架并不是直接与底层的数据库产品直接操作事务,而是提供一个“事务抽象层”,它叫 事务管理平台,它自己定义了多个事务的属性,可以由程序员来控制。




Spring 框架 事务平台

  • TransactionDefinition 接口,此接口是Spring框架对事务属性的定义,从如下几个不同的角度来定义事务属性:

①事务的传播性 [Propagation]

  • PROPAGATION_MANDATORY 强制要加入事务,如果没有事务,则抛出异常
  • PROPAGATION_NESTED 如果已有事务,则加入嵌套事务之中,没有的话,则创建新的事务
  • PROPAGATION_NEVER 不支持当前事务,如果有事务,则抛出异常
  • PROPAGATION_NOT_SUPPORTED 不支持当前事务,始终以非事务方式执行
  • PROPAGATION_REQUIRED 如果已有事务,则支持当事务,没有的话,则创建新的事务
  • PROPAGATION_REQUIRES_NEW 如果已有事务,则挂起当前事务,并开启新事务,如果没有,直接开启新事务
  • PROPAGATION_SUPPORTS 如果已有事务,则支持当前事务,如果没有,则以非事务方式执行。

②事务的隔离性 [isolation]

  • ISOLATION_DEFAULT 采用底层数据存储的默认事务隔务级别
  • ISOLATION_READ_UNCOMMITED 表示允许脏读、不可重复性、幻读 的隔离级别
  • ISOLATION_READ_COMMITED 表示不允许脏读,但是存在不可重复性、幻读 的隔离级别
  • ISOLATION_REPEATABLE_READ 表示不允许脏读和不可重复读,但是允许幻读 的隔离级别
  • ISOLATION_SERIALIZABLE 表示不允许脏读和不可重复读以及幻读 的隔离级别
  • 什么叫脏读[Dirty Read], 表示一个事务可以读取到另一个事务没有提交的数据。
  • 什么叫不可重复读[non repeatable read], 表示在同一个事务中,执行相同的SQL语句,两次读到的 列值内容不一样。
  • 什么叫幻读[phantom], 是一种特列的不可重复读,表示在同一个事务中,执行相同的SQL语句,两次读到的行数量不一样。
注: 事务的隔离级别越高,并发的性能就越低。

③事务的只读性

isReadOnly   表示事务是否是只读的。

④事务的超时性

Timeout  表示事务在指定的时间内拿不到锁,就抛出事务超时异常

⑤事务的回滚性

rollback  指定回滚的操作

PlatformTransactionManager 接口

平台事务管理器接口,是Spring框架为统一事务处理抽象出来的一个独立平台的事务管理器,它有不同的实现:

TransactionStatus 接口

用来记录事务的状态的,里面有判断事务状态、事务保存点的方法,以及设置成只读事务的操作方法

SavepointManager 接口

事务保存点管理器接口,它提供了创建事务保存点、删除事务保存点以及回调到事务保存点的操作

注:以上每一个接口,Spring框架都提供了内置的实现。

spring事务中脏读 spring是如何处理事务的_spring事务中脏读


Spring 事务管理图




Spring 申明式事务的使用

前提:

  1. 要开启AOP:
    在 AppConfig 配置类中,使用 @EnableTransactionManagement 来开启事务处理
  2. 导入相关的依赖:
    导入 spring-jdbc 的依赖即可,它会间接依赖 spring-tx 依赖




开发步骤

  1. 准备一个 maven 项目
  2. 在 AppConfig.java 中,使用 @EnableTransactionManagement 来开启事务处理, 并且要指定使用哪个具体的事务管理器,此处我们选择 DataSourceTransactionManager
  3. 在需要添加事务的类型上或者方法上,打上 @Transactional 注解即可