第 9 章 · 第五节
动数据之前先打招呼
事务操作某个数据对象之前先申请加锁,锁没放开别人改不动。

关键术语
封锁
Lo
c
操作
数
重 点
隔离级别是说要什么效果,封锁是说这个效果怎么做出来。
打个比方
会议室要先预约,你在开会的时候别人推不开门。
事务操作某个数据对象之前先申请加锁,锁没放开别人改不动。

隔离级别是说要什么效果,封锁是说这个效果怎么做出来。
会议室要先预约,你在开会的时候别人推不开门。
锁住的数据量越少,撞车的机会越小,并发度越高。

粒度小并发高但管理开销大,粒度大省事但一锁一大片。
改一行数据,锁一整张表有什么坏处?
表级锁开销小加锁快不会死锁,行级锁开销大但并发度最高。

| 表锁 | 行锁 | |
|---|---|---|
| 开销 | 小 | 大 |
| 并发 | 低 | 高 |
| 死锁 | 不会 | 会 |
| 冲突 | 多 | 少 |
InnoDB 默认用行锁,所以它会死锁,MyISAM 只有表锁所以不会。
行锁其实锁的是索引项,WHERE 里的字段没有索引时会退化成锁全表。
X 锁是写锁,加了别人什么锁都加不上。S 锁是读锁,几个人可以一起加。

| 锁 | 别人还能 |
|---|---|
| X 排它锁 | 什么都不行 |
| S 共享锁 | 再加 S 锁 |
T1 给整张表加了排它锁,T2 连读都读不动,只能等着。

写锁一上,别人的 SELECT 都会卡在那儿,直到 UNLOCK TABLES。
LOCK TABLES 会顺手把当前没提交的事务提交掉,课件没提这一条。
T1 加了共享锁,自己反而改不了,T2 读得到但也改不了。

加了 READ 锁之后自己也只能读,改这张表会报 1099。
为什么自己加的读锁会把自己也挡住?
共享锁允许并发读取,谁也别想在这时候改数据。
