数据库原理与应用 第 9 章 · 第六节
课程第 9 章第六节 封锁协议一级协议二级协议三级协议死锁四个条件怎么发现活锁小结 版式
第 9 章 数据库并发控制与封锁 · 第六节

封锁协议与死锁

三级封锁协议各挡住什么,死锁怎么来的、怎么发现、怎么避开。
本 节 知 识 点
  1. 40什么时候加锁、加多久的规矩
  2. 41改之前加 X 锁,持到事务结束
  3. 42读之前加 S 锁,读完就放
  4. 43S 锁也持到事务结束
  5. 44两个人各攥着对方要的东西
  6. 45死锁成立要同时满足四条
  7. 46超时法和等待图法
  8. 47锁一直在放,就是轮不到它
  9. 48这一章的一张全景图
40
第 9 章 · 第六节

什么时候加锁、加多久的规矩

何时申请、申请哪种、持多久、何时释放,这套约定叫封锁协议。

第 40 页课件

关键术语

Lo
c

重 点

三级封锁协议一级比一级严,各自多挡住一种数据不一致性。

试一试锁持到什么时候

协议
这一级挡得住什么
41
第 9 章 · 第六节

改之前加 X 锁,持到事务结束

只管写,读数据完全不加锁。

第 41 页课件

重 点

写和写不会再打架,所以一级协议挡住了丢失更新。

分清楚管到哪

动作要不要锁
改数据加 X 锁
读数据不加

想一想

只加写锁,能挡住脏读吗?

42
第 9 章 · 第六节

读之前加 S 锁,读完就放

在一级的基础上,读也要先申请共享锁。

第 42 页课件

重 点

读之前要拿 S 锁,别人正改着就拿不到,脏数据读不着了。

知道更多

S 锁读完立刻释放,所以第二次再读时对方可能已经改完提交了。

上机做

上机四第 6 题 看看二级为什么挡不住重复读

43
第 9 章 · 第六节

S 锁也持到事务结束

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

第 43 页课件

重 点

S 锁攥到底,中间没人改得动,所以两次读一定一样。

记牢它三级递进

  1. 一级只锁写
  2. 二级读也锁
  3. 三级读锁不放

想一想

三级协议对应哪一个隔离级别?

44
第 9 章 · 第六节

两个人各攥着对方要的东西

T1 锁了学生表要成绩表,T2 锁了成绩表要学生表,两个都动不了。

第 44 页课件

关键术语

De
a

重 点

死锁不是谁写错了,是两笔事务加锁的顺序反了。

试一试换个顺序死锁就没了

加锁顺序
事务 T1 事务 T2 学生表 成绩表 等成绩表 等学生表 T2 排在后面,等一下就好

上机做

上机四第 7 题 亲手造一次死锁

45
第 9 章 · 第六节

死锁成立要同时满足四条

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

第 45 页课件

记牢它四条

  1. 互斥
  2. 占着要
  3. 抢不走
  4. 转成圈

重 点

避免死锁的三个办法,本质都是去掉循环等待这一条。

知道更多

顺序加锁法最实用:约定所有事务按同样的顺序访问各张表。

46
第 9 章 · 第六节

超时法和等待图法

等太久就算死锁,或者画出等待关系图看有没有回路。

第 46 页课件

分清楚两种做法

方法怎么判
超时法等超过阈值
等待图法图里有回路

重 点

InnoDB 用的是等待图法,一发现回路立刻挑一笔回滚,报 1213。

想一想

超时法会不会把只是慢的事务误判成死锁?

47
第 9 章 · 第六节

锁一直在放,就是轮不到它

别人一个接一个插队,某个事务永远排不上。

第 47 页课件

关键术语

Li
v

分清楚分清楚

现象根子
死锁互相等
活锁总被插队

重 点

活锁的解法是先来先服务,按申请顺序排队,不许插队。

试一试死锁和活锁差在哪

看哪个
时刻T1别人
48
第 9 章 · 第六节

这一章的一张全景图

事务的四条性质、四种不一致性、封锁与封锁协议,串成一条线。

第 48 页课件

记牢它四步

  1. 事务捆住
  2. 并发出错
  3. 隔离级挡
  4. 封锁实现

重 点

隔离级别说的是要什么效果,封锁协议说的是这个效果怎么做出来。

上机做

上机四第 8 题 换个顺序避开死锁

保山学院·人工智能教研室·曹鼎鼎