从一个人用,到很多人一起用
前八章都当作只有你一个人在敲,这一章开始有别人。

重 点
一个人敲的时候,SQL 怎么写就怎么算。多个人同时敲,结果还要看时序。
打个比方
一个人取款机取钱没问题,两个人同时对着一个账户取,就得排队。
前八章都当作只有你一个人在敲,这一章开始有别人。

一个人敲的时候,SQL 怎么写就怎么算。多个人同时敲,结果还要看时序。
一个人取款机取钱没问题,两个人同时对着一个账户取,就得排队。
并发是什么,事务是什么,会出什么错,怎么防,锁怎么加。

四种数据不一致性是这一章的骨架,后面两节都在讲怎么把它们挡掉。
一个用户跑完下一个才能进,大部分时间机器在等输入输出。

| 做法 | 代价 |
|---|---|
| 排队一个一个来 | 机器闲着 |
| 同时放进来 | 可能出错 |
并发是为了把机器用满,代价是要花力气防住数据不一致。
并发度越高越好吗?
事务是一个逻辑工作单元,里面的操作要么全算数要么全不算数。

判断一串操作该不该做成事务,看它们是不是一个逻辑上的整体。
转账是先扣再加两步,只做完一步就是有人凭空少了钱。
自动提交、显式、隐式、分布式,日常用的是前两种。

| 模式 | 什么时候提交 |
|---|---|
| 自动提交 | 每句都提交 |
| 显式 | 写 COMMIT 才提交 |
MySQL 默认是自动提交,每一句 SQL 自己就是一笔事务。
三句话分别管开始、落地和撤销,事务的一生就这三步。

ROLLBACK 撤的是这一笔事务里所有的改动,不是最后一句。
COMMIT 之后还能 ROLLBACK 回去吗?
原子性、一致性、隔离性、持久性,转账这个例子把四条都占全了。

ACID 说的是同一件事的四个侧面,不是四条互不相干的规定。
这四个词是教材 9.2 节的核心,选择题里常给一句话让你判断属于哪一条。
六步操作外加一句 COMMIT,中间任何一步出事都不能只做一半。

做到一半断电,重启之后那一半也不算数,整笔撤回起点。

原子性靠回滚日志实现,没提交的改动重启时会被一条条撤销。
转账扣了钱没到账,这种半截状态银行不认,直接当作没转过。
事务从一个正确状态跳到另一个正确状态,中间那个不平的状态外人看不见。

account1 加 account2 转账前后都是 1400,这个不变量就是一致性。
一致性靠数据库自己保证,还是靠写事务的人保证?
没提交的时候别人看不见,几个人同时转账结果也要和一个一个转一样。

四种数据不一致性全是隔离性没做够造成的,隔离级别就是调它的旋钮。
换衣间的帘子,你在里面换到一半,外面的人不该看见。
COMMIT 一返回,改动就写进了日志,之后停电断网都丢不了。

| 性质 | 管的是 |
|---|---|
| 原子性 | 没提交的撤掉 |
| 持久性 | 已提交的留住 |
原子性和持久性是一体两面,靠的是同一套日志。