数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务的使用是数据库管理系统区别文件系统的重要特征之一。

事务拥有四个重要的特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),人们习惯称之为 ACID 特性。下面我逐一对其进行解释。

事务隔离级别
SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:

  1. 读未提交(READ UNCOMMITTED)
  2. 读提交 (READ COMMITTED)Oracle 和 SQL Server 的默认隔离级别
  3. 可重复读 (REPEATABLE READ)MySQL 默认的隔离级别
  4. 串行化 (SERIALIZABLE)

以下总结了各个隔离级别下产生的一些问题

隔离级别 脏读 不可重复读 幻读
读未提交(Read uncommitted) 可以出现 可以出现 可以出现
读提交(Read committed) 不允许出现 可以出现 可以出现
可重复读 (Repeatable read) 不允许出现 不允许出现 可以出现
序列化(Serializable ) 不允许出现 不允许出现 不允许出现

以下几个概念是事务隔离级别要实际解决的问题:
脏读
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。

可重复读
可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据**更新(UPDATE)**操作。

不可重复读
对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据**更新(UPDATE)**操作。

幻读
幻读是针对数据**插入(INSERT)**操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。

推荐这篇文章说的很详细:

  1. https://developer.ibm.com/zh/articles/os-mysql-transaction-isolation-levels-and-locks/
  2. https://zhuanlan.zhihu.com/p/117476959
  3. https://mp.weixin.qq.com/s/W07ZIW0GRtsrS5nuiy2z_A