MySQL技术内幕:SQL编程》读书笔记 -- 事务编程

概述

事务是数据库区别于文件系统的重要特征之一。在文件系统中,如果用户正在写文件,这个时候操作系统突然奔溃,很可能造成这个文件就被破坏了。

事务可由一条非常简单的SQL语句组成,也可由一组复杂的SQL语句组成,事务是访问并更新数据库中各项数据项的一个程序执行单元,要么全部执行,要么都不执行。

本篇文章只介绍InnoDB存储引擎中的事务,在InnoDB中,事务完全满足ACID特性,即原子性,一致性,隔离性和持久性。

事务分类

1、扁平事务

扁平事务是最简单的一种事务,也是应用最频繁的一种事务,在扁平事务中,所有操作都在同一层级,由BEGIN WORK开始,COMMIT WORK 或 ROLLBACK WORK 结束,要么全部执行,要么都回滚,下图给出了扁平事务的三种不同情况:

MySQL技术内幕:SQL编程》读书笔记 -- 事务编程_第1张图片

2、带有保存点的扁平事务

扁平事务的限制是不能提交或回滚事务的某一部分,因此 “带有保存点的扁平事务” 弥补了扁平事务的不足,允许事务执行过程中回滚到同一事务中较早的一个状态,即某一保存点(savepoint),详情如下图:

MySQL技术内幕:SQL编程》读书笔记 -- 事务编程_第2张图片

3、链事务

链事务带有保存点的扁平事务的一个变种,在带有保存点的扁平事务中,当系统发生奔溃时,所有的保存点都将消失,因为保存点是非持久的,这意味着当系统恢复时,需要从头开始重新执行事务,而不能从最近的一个保存点继续执行事务。

链事务的思想是:在提交一个事务是,释放不需要的数据对象,将必要的上下文隐式的传给下一个要开始的事务,注意:提交事务操作和开始下一个事务操作将合并为一个原子性操作。这意味着下一个事务将看到上一个事务的结果。链事务带有保存点的扁平事务的不同点在于:带有保存点的扁平事务可以回滚到任意一个保存点,链事务只能回滚当前事务。

MySQL技术内幕:SQL编程》读书笔记 -- 事务编程_第3张图片

4、嵌套事务

嵌套事务是一个层次结构框架,有一个顶层事务,控制着各个层次的事务,顶层事务之下嵌套的事务被称为子事务,子事务可以是嵌套事务,也可以是扁平事务;子事务可以提交也可有回滚,但是必须等到顶层事务提交之后才能生效。

MySQL技术内幕:SQL编程》读书笔记 -- 事务编程_第4张图片

5、分布式事务

分布式事务一般是分布式环境下运行的扁平事务,比如多个库的操作。

隐式提交的SQL语句

ALTER、DROP、CREATE、RENAME TABLE、TRUNCATE TABLE 此类语句是隐式提交的。

事务的隔离级别

1、事务并发存在的问题

1)脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2)不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

3)幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

  总结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

2、事务隔离级别

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

你可能感兴趣的:(MySQL)