第 9 章 · 第三节
SQL 标准定了四档
从读未提交到串行化,越往上挡得越多,等得也越久。

记牢它由低到高
- 读未提交
- 读已提交
- 可重复读
- 串行化
重 点
级别越高异常越少并发越低,选哪一档是拿正确性换速度。
想一想
为什么不干脆全用最高那一级?
从读未提交到串行化,越往上挡得越多,等得也越久。

级别越高异常越少并发越低,选哪一档是拿正确性换速度。
为什么不干脆全用最高那一级?
一句 SELECT 查得到当前级别,一句 SET 就能换一档。

| 写法 | 影响谁 |
|---|---|
| GLOBAL | 以后新连的 |
| SESSION | 当前这个窗口 |
上机改隔离级别一律写 SESSION,只动自己这个窗口。
改成 GLOBAL 之后,已经连着的窗口会跟着变吗?
这一级什么也不挡,别人改了没提交你照样读得到。

这一级基本不做隔离,四种异常里只有丢失更新还被行锁挡着。
实际项目里几乎没人用它,课上用它是为了把脏读演给你看。
T1 设成读未提交并开事务先查一次,T2 开事务改了 100 元不提交。

两段语句要在两个窗口里交替敲,一个窗口是做不出并发的。
T2 那句 update 后面为什么不写 commit?
T2 那 100 元根本没提交,T1 却已经读到了 600。

T2 只要 ROLLBACK,T1 手里那个 600 就成了一个从来没存在过的数。
| T1 查的时机 | account1 | 为什么 |
|---|
只认已经提交的数据,别人手里那笔没落地就跟你无关。

这一级挡住了脏读,代价是同一笔事务里两次读可能不一样。
Oracle 和 SQL Server 的默认级别就是这一档,MySQL 不是。
T1 设成读已提交后开事务,一共查三次,中间穿插 T2 的改和提交。

三次查询分别在 T2 改之前、改了没提交、提交之后,看的就是这三个时机。
T2 改了没提交,所以 T1 第二次查还是 500。

脏数据读不到了,这就是读已提交比读未提交强的地方。
如果这时 T2 提交了,T1 第三次查会是多少?
同一笔事务里三次查,前两次 500 第三次 600,这就是不可重复读。

读已提交挡得住脏读,挡不住不可重复读和幻象读。
| 级别 | 还会出的错 |
|---|---|
| 读未提交 | 脏读等三种 |
| 读已提交 | 不可重复读 |