数据库原理与应用 第 9 章 · 上机四
课程第 9 章上机四 加个写锁看一次卡住加个读锁B 的三次尝试只认锁住的锁什么时候放造一次死锁换个顺序连起来 版式
第 9 章 数据库并发控制与封锁 · 上机四

封锁、协议与死锁

八道题把表锁、行锁、三级协议和死锁全撞一遍,1099、1100、1213 三个报错都要亲手见到。
已完成 0 / 8
本 次 上 机 题 目
  1. 01LOCK TABLES account WRITE
  2. 02B 的 SELECT 真的停在那儿
  3. 03自己加的读锁把自己也挡住了
  4. 04读得了,改不了,读锁加得上
  5. 05LOCK TABLES 一上手就只认锁住的表
  6. 06读完就放和攥到结束,差一次重读
  7. 07两个人各攥着对方要的那一行
  8. 08两笔事务都从 account1 开始就不会死锁
  9. 封锁、协议、死锁跑一条完整的线
01
第 9 章 · 上机四

LOCK TABLES account WRITE

A 把整张表独占了,B 连读都读不动。

窗口 A
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
上下两扇窗口是同一台服务器上的两个会话。拿不到锁的那句会卡住,等对方放手才接着跑。
mysql>
窗口 B
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
mysql>
这一句敲进窗口 A

重 点

WRITE 锁是排它锁,拿着它自己读写都行,别人什么也干不了。

关键术语

Ex
c
02
第 9 章 · 上机四

B 的 SELECT 真的停在那儿

A 一句 UNLOCK TABLES,B 那句自己就补跑完了。

窗口 A
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
上下两扇窗口是同一台服务器上的两个会话。拿不到锁的那句会卡住,等对方放手才接着跑。
mysql>
窗口 B
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
mysql>
这一句敲进窗口 A

重 点

B 那句不是失败,是排队,A 一放手它自己接着跑完。

知道更多

真机上 B 那个窗口就是光标不动,等到超时才报 1205。

想一想

如果 A 一直不 UNLOCK,B 要等多久?

03
第 9 章 · 上机四

自己加的读锁把自己也挡住了

LOCK TABLES account READ 之后,A 自己也改不了。

窗口 A
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
上下两扇窗口是同一台服务器上的两个会话。拿不到锁的那句会卡住,等对方放手才接着跑。
mysql>
窗口 B
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
mysql>
这一句敲进窗口 A

重 点

READ 锁只保证大家读到的一样,谁都不许改,包括加锁的人自己。

关键术语

Sh
a
04
第 9 章 · 上机四

读得了,改不了,读锁加得上

承接上一题,B 依次试三样。

窗口 A
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
上下两扇窗口是同一台服务器上的两个会话。拿不到锁的那句会卡住,等对方放手才接着跑。
mysql>
窗口 B
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
mysql>
这一句敲进窗口 A

重 点

读锁之间相容,读锁和写不相容,相容矩阵讲的就是这两句。

分清楚B 三次尝试

B 想干的结果
读数据
加 READ 锁
改数据等着
05
第 9 章 · 上机四

LOCK TABLES 一上手就只认锁住的表

锁住 account 之后去查别的库的表,报 1100。

窗口 A
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
上下两扇窗口是同一台服务器上的两个会话。拿不到锁的那句会卡住,等对方放手才接着跑。
mysql>
窗口 B
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
mysql>
这一句敲进窗口 A

重 点

手里攥着表锁的时候,没锁进来的表一律 1100,UNLOCK 之后才恢复。

练一练

锁了 account 还想查 s 表,正确做法是?
  1. A先 UNLOCK 再查
  2. BLOCK 时把两张都写上
  3. C两种都行
答案 C

要么放开锁,要么一次把要用的表都锁进来。

06
第 9 章 · 上机四

读完就放和攥到结束,差一次重读

读已提交对应二级协议,可重复读对应三级。

窗口 A
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
上下两扇窗口是同一台服务器上的两个会话。拿不到锁的那句会卡住,等对方放手才接着跑。
mysql>
窗口 B
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
mysql>
这一句敲进窗口 A

重 点

前半段两次不一样,后半段两次一样,差的就是那把读锁放没放。

分清楚两级协议

协议S 锁持到
二级读完就放
三级事务结束
07
第 9 章 · 上机四

两个人各攥着对方要的那一行

A 锁 account1 要 account2,B 反过来,报 1213。

窗口 A
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
上下两扇窗口是同一台服务器上的两个会话。拿不到锁的那句会卡住,等对方放手才接着跑。
mysql>
窗口 B
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
mysql>
这一句敲进窗口 A

重 点

B 被挑出来当牺牲品,整笔回滚,A 那句排队的马上就跑完了。

知道更多

InnoDB 用等待图法,一发现回路立刻回滚代价小的那一笔,不用等超时。

想一想

被回滚的那一笔,程序该怎么办?

08
第 9 章 · 上机四

两笔事务都从 account1 开始就不会死锁

顺序加锁法,环接不上就锁不死。

窗口 A
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
上下两扇窗口是同一台服务器上的两个会话。拿不到锁的那句会卡住,等对方放手才接着跑。
mysql>
窗口 B
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
mysql>
这一句敲进窗口 A

重 点

B 一开始就在排队等 account1,等到了再往下走,谁也没死。

记牢它避开死锁

  1. 顺序一致
  2. 一次锁全
  3. 直接要写锁
第 9 章 · 上机四

封锁、协议、死锁跑一条完整的线

从表锁到行锁到死锁,一口气走完。

窗口 A
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
上下两扇窗口是同一台服务器上的两个会话。拿不到锁的那句会卡住,等对方放手才接着跑。
mysql>
窗口 B
Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
mysql>
这一句敲进窗口 A

重 点

表锁挡住整张表,行锁只挡那一行,加锁顺序一反就是死锁。

想一想

最后那个合计为什么没变?

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