第 9 章 · 第六节
什么时候加锁、加多久的规矩
何时申请、申请哪种、持多久、何时释放,这套约定叫封锁协议。

关键术语
封锁
协
Lo
c
关于
加
重 点
三级封锁协议一级比一级严,各自多挡住一种数据不一致性。
试一试锁持到什么时候
协议
这一级挡得住什么
何时申请、申请哪种、持多久、何时释放,这套约定叫封锁协议。

三级封锁协议一级比一级严,各自多挡住一种数据不一致性。
只管写,读数据完全不加锁。

写和写不会再打架,所以一级协议挡住了丢失更新。
| 动作 | 要不要锁 |
|---|---|
| 改数据 | 加 X 锁 |
| 读数据 | 不加 |
只加写锁,能挡住脏读吗?
在一级的基础上,读也要先申请共享锁。

读完不放手,一直攥到 COMMIT 才松,别人这期间改不了。

S 锁攥到底,中间没人改得动,所以两次读一定一样。
三级协议对应哪一个隔离级别?
T1 锁了学生表要成绩表,T2 锁了成绩表要学生表,两个都动不了。

互斥、请求与保持、不剥夺、循环等待,缺一条就锁不死。

避免死锁的三个办法,本质都是去掉循环等待这一条。
顺序加锁法最实用:约定所有事务按同样的顺序访问各张表。
等太久就算死锁,或者画出等待关系图看有没有回路。

| 方法 | 怎么判 |
|---|---|
| 超时法 | 等超过阈值 |
| 等待图法 | 图里有回路 |
InnoDB 用的是等待图法,一发现回路立刻挑一笔回滚,报 1213。
超时法会不会把只是慢的事务误判成死锁?
别人一个接一个插队,某个事务永远排不上。

| 现象 | 根子 |
|---|---|
| 死锁 | 互相等 |
| 活锁 | 总被插队 |
活锁的解法是先来先服务,按申请顺序排队,不许插队。
| 时刻 | T1 | 别人 |
|---|
事务的四条性质、四种不一致性、封锁与封锁协议,串成一条线。
