事务指的是一个操作序列,用来维护数据库完整性的。该操作序列中的多个操作要么全部执行,要么全不执行,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。由 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 条 |
补充
- 与幻读的区别是: 不可重复读的重点是修改,幻读的重点在于新增或者删除
- 解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
