第 9 章 · 第二节 · 课件第 13 页
并发操作与并发控制
多个用户同时操作同一数据是并发操作,合理调度它们的技术是并发控制。

重 点
并发控制不是禁止并发,而是让并发执行的结果与事务逐个执行的结果相同。
多个用户同时操作同一数据是并发操作,合理调度它们的技术是并发控制。

并发控制不是禁止并发,而是让并发执行的结果与事务逐个执行的结果相同。
修改被覆盖,或者读到了未提交的数据。
| 时间 | 事务 T1 | 事务 T2 |
|---|---|---|
| t1 | 读取 R = 1000 | 读取 R = 1000 |
| t2 | 取走 100,写入 R = 900 | |
| t3 | 取走 200,写入 R = 800 |
最后 R = 800,T1 的修改被 T2 覆盖了
| 时间 | 事务 T1 | R | 事务 T2 |
|---|---|---|---|
| t1 | R = R - 100,未提交 | 900 | |
| t2 | 900 | 读取 R = 900 | |
| t3 | ROLLBACK | 1000 |
T1 回滚后 R 恢复为 1000,T2 读到的 900 是脏数据
MySQL 修改数据时自动给行加 X 锁,两个事务同时修改同一行,后一个要等待,实验 3-1 验证这一点。
同一事务中两次读到的值不同,或行数不同。
| 时间 | 事务 T1 | 事务 T2 |
|---|---|---|
| t1 | 读取 R = 1000 | |
| t2 | R = R - 100,提交 | |
| t3 | 再次读取 R = 900 |
| 时间 | 事务 T1 | 事务 T2 |
|---|---|---|
| t1 | 查询 R < 1000,3 行 | |
| t2 | 插入一行,提交 | |
| t3 | 再次查询 R < 1000,4 行 |
行的值没有变,是行数变了,属于幻象读。
读脏数据读的是未提交的数据,不可重复读和幻象读读的是已提交的数据。

丢失更新是两个写操作之间的问题,另外三种都是读操作遇到了别的事务的写操作。