数据库原理与应用 第 9 章 · 上机二
课程第 9 章上机二 盖不掉读一次脏数据脏在哪里两次读不一样行数变了默认级别再试分得清吗连起来 版式
第 9 章 数据库并发控制与封锁 · 上机二

四种不一致性亲手做

七道题把四种数据不一致性一个一个做出来,顺便看看哪一种其实做不出来。
已完成 0 / 7
本 次 上 机 题 目
  1. 01丢失更新在 InnoDB 上做不出来
  2. 02读未提交下,B 没提交 A 也看得见
  3. 03B 一回滚,A 手里那个数就成了假的
  4. 04读已提交下的不可重复读
  5. 05读已提交下的幻象读
  6. 06可重复读下幻象读也没了
  7. 07四种不一致性各挑一句话认一认
  8. 同一段操作在两个级别下各跑一次
01
第 9 章 · 上机二

丢失更新在 InnoDB 上做不出来

B 那句 UPDATE 会卡住,等 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

重 点

B 那 200 是在 A 减完之后的数上减的,两笔改动一笔都没丢。

知道更多更正

课件第 14 页那张图是理论模型,InnoDB 的行锁让它做不出来。

02
第 9 章 · 上机二

读未提交下,B 没提交 A 也看得见

把 A 调到最低一级,B 改了不提交,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

重 点

A 第二次读到的是加过 100 的数,可这笔钱 B 还没提交,随时会撤回去。

想一想

这时候 A 拿这个数去算利息,算得对吗?

03
第 9 章 · 上机二

B 一回滚,A 手里那个数就成了假的

承接上一题,B 撤销之后 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

重 点

刚才读到的那个数从来没有真正存在过,这就是脏读最要命的地方。

练一练

脏读读到的数据有什么共同点?
  1. A都是错的
  2. B都可能被撤销
  3. C都比真值大
答案 B

没提交的数据随时可能回滚,用它算出来的一切都不作数。

04
第 9 章 · 上机二

读已提交下的不可重复读

A 两次读之间 B 改完提交了,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

重 点

这次读到的是 B 已经提交的合法数据,问题在于同一笔事务里前后对不上。

分清楚和脏读比

异常读到的是
脏读没提交的
不可重复读已提交的
05
第 9 章 · 上机二

读已提交下的幻象读

同样的 WHERE 条件查两次,中间 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 是删了一行,这还算幻象读吗?

06
第 9 章 · 上机二

可重复读下幻象读也没了

换成 MySQL 默认那一级,同样的操作再做一遍。

窗口 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

重 点

事务里两次行数一样,提交之后再查才多出那一行。

知道更多更正

课件说可重复读挡不住幻象读,那是 SQL 标准的说法,InnoDB 挡得住。

07
第 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

分清楚四选一

现象叫什么
改动被盖丢失更新
读到没提交脏读
两次值不同不可重复读
两次行数不同幻象读

练一练

两笔事务同时给同一行加 100,最后只加了 100,这是哪一种?
  1. A脏读
  2. B丢失更新
  3. C幻象读
答案 B

一笔的修改被另一笔覆盖掉,这就是丢失更新。

第 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

重 点

前半段两次读不一样,后半段两次一样,差别只在那一句 SET。

想一想

后半段 A 提交之后再查一次,会是多少?

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