第 9 章 · 第二节
合理调度并发事务的技术
多个用户同时操作同一份数据叫并发操作,管住它叫并发控制。

关键术语
并发
控
Co
n
调度
并
重 点
并发控制不是禁止并发,是让并发跑出来的结果和一个一个跑一样。
想一想
两个人同时查同一张表,需要并发控制吗?
多个用户同时操作同一份数据叫并发操作,管住它叫并发控制。

并发控制不是禁止并发,是让并发跑出来的结果和一个一个跑一样。
两个人同时查同一张表,需要并发控制吗?
两笔事务都读到 1000,各自算完写回,先写的那笔像没做过。

两个人都是拿旧值算的,后写的那个把前一个的结果整个盖掉。
这张图在 InnoDB 上做不出来,第二句 UPDATE 会被行锁卡住等着。
T1 改成 900 没提交,T2 读走了,T1 一回滚这个 900 就是假的。

两次查询之间别人改完提交了,第二次读出来的值变了。

| 异常 | 读到的是 |
|---|---|
| 脏读 | 没提交的 |
| 不可重复读 | 已提交的 |
读到的是合法的已提交数据,问题出在同一笔事务里前后对不上。
同样的条件查两次,别人插了一行或删了一行,记录条数变了。

| 异常 | 变的是 |
|---|---|
| 不可重复读 | 某一行的值 |
| 幻象读 | 行的条数 |
考试常考这一对的区别:一个是值变了,一个是多出来或少掉一行。
| 时刻 | 事务 T1 | 库里的 R | 事务 T2 |
|---|
并发操作不加控制会出四种错,后面两节讲怎么一层层挡掉。

丢失更新是写和写打架,另外三种都是读撞上了别人的写。
四种里哪一种是写和写之间的问题?