事务指的是一个操作序列,用来维护数据库完整性的。该操作序列中的多个操作要么全部执行,要么全不执行,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。由 DBMS 中的事务管理子系统负责事务的处理

脏读

脏读( Dirty Read ),当一个事务正在访问数据并且对数据进行了修改,但是这种修改未提交或者回滚,另外一个事务也访问了这个数据,然后使用了这个数据,那么该事务读到的数据是”脏数据“

时间点 事务A 事务B
1 开启事务A
2 开启事务B
3 查询余额为 100
4 余额增加至 150
5 查询余额为 150
6 事务回滚

不可重复读

不可重复度( Unrepeatableread ),指在一个事务内多次读同一个数据。也就是这个事务还没结束时,另一个事物也访问该数据并且修改该数据,导致第一个事务两次读取的数据可能不太一样

时间点 事务A 事务B
1 开启事务A
2 开启事务B
3 查询余额为 100
4 余额增加至 150
5 查询余额为 100
6 提交事务
7 查询余额为 150

幻读

幻读( Phantom Read ),与不可重复读类似,一个事务读取了数据,另一个并发事务插入了一些数据,导致第一个事务出现了一些原本不存在的记录

时间点 事务A 事务B
1 开启事务A
2 开启事务B
3 查询 id<3 的所有记录,共 3 条
4 插入一条记录 id=2
5 提交事务
6 查询 id<3 的所有记录,共 4 条

补充

  • 与幻读的区别是: 不可重复读的重点是修改,幻读的重点在于新增或者删除
  • 解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表