Spring5.0源码事务管理概述,如何深入理解其核心原理与实现?

摘要:Spring源码学习系列博客专栏:链接 Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1、什么是事务? 事务就是一组原子性的SQL操作
Spring源码学习系列博客专栏:链接 Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1、什么是事务? 事务就是一组原子性的SQL操作,或者说一个独立的工作单元。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit) 注意:Spring的事务支持是基于数据库事务的,在MySQL数据库中目前只有InnoDB或者NDB集群引擎才支持,MySQL5.0之前的默认MyISAM存储引擎是不支持事务的 2、事务的ACID特性 ACID其实是事务特性的英文首字母缩写,具体含义是:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability) 原子性(atomicity):事务是一个原子操作,由一系列动作组成。整个事务中的所有操作要么全部提交成功,要么全部失败回滚; 一致性(consistency):数据库总是从一个一致性的状态转换到另外一个一致性的状态,执行事务前后,数据保持一致; 隔离性(isolation): 因为有多个事务处理同个数据的情况,因此每个事务都应该与其他事务隔离开来,防止数据脏读、不可重复读等等情况; 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢; 3、什么是脏读、不可重复读、幻读? 脏读 在A事务修改数据,提交事务之前,另外一个B事务读取了A事务未提交事务之前的数据,这种情况称之为脏读(Dirty Read) 不可重复读 一个A事务在读取某些数据,第1次读取出来的数据结果和第2次读取出来的不一致,因为在两次数据读取期间,另外的事务对数据进行了更改 幻读 幻读和不可重复读是很类似的,不同的地方在于幻读侧重于事务对数据的删除或者新增,都是因为在两次数据读取期间,因为另外事务对数据的删除还是新增,导致第2次读取的数据和第1次不一致 4、Spring事务管理核心接口 5、事务隔离级别 定义:事务的隔离级别定义了一个事务可能受其他并发事务影响的程度。隔离级别可以不同程度的解决脏读、不可重复读、幻读。 隔离级别 描述 脏读 不可重复读 幻读 ISOLATION_DEFAULT 使用后端数据库默认的隔离级别,默认的为Repeatable read (可重复读) 否 否 是 ISOLATION_READ_UNCOMMITTED 不可提交读,允许读取尚未提交事务的数据,可能会导致脏读、不可重复读、幻读 是 是 是 ISOLATION_READ_COMMITTED 提交读,读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生 否 是 是 ISOLATION_REPEATABLE_READ 可重复读,可以阻止脏读和不可重复读,但幻读仍有可能发生 否 否 是 ISOLATION_SERIALIZABLE 串行化,这种级别是最高级别,服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读 否 否 否 6、事务的传播行为 事务传播行为 描述 PROPAGATION_REQUIRED 必须,默认值。如果A有事务,B将使用该事务;如果A没有事务,B将创建一个新的事务 PROPAGATION_SUPPORTS 支持。如果A有事务,B将使用该事务;如果A没有事务,B将以非事务执行 PROPAGATION_MANDATORY 强制。A如果有事务,B将使用该事务;如果A没有事务,B将抛异常 PROPAGATION_REQUIRES_NEW 必须新的。如果A有事务,将A的事务挂起,B创建一个新的事务;如果A没有事务,B创建一个新的事务。 PROPAGATION_NOT_SUPPORTED 不支持。如果A有事务,将A的事务挂起,B将以非事务执行;如果A没有事务,B将以非事务执行。 PROPAGATION_NEVER 从不。如果A有事务,B将抛异常;如果A没有事务,B将以非事务执行 PROPAGATION_NESTED 嵌套。A和B底层采用保存点机制,形成嵌套事务。 7、事务管理其它属性 前面介绍了事务管理的隔离级别和传播行为这两个重要的属性,接着介绍一下事务的其它属性 事务超时属性 事务超时,属性值是timeout,指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。以 int 的值来表示超时时间,其单位是秒,默认值为-1。
阅读全文