数据库原理与应用 第 9 章 · 上机三
课程第 9 章上机三 先看看现在几级例9-2升一级第三次查例9-4事务里改不动串行化对照着填连起来 版式
第 9 章 数据库并发控制与封锁 · 上机三

四个隔离级别

八道题把课件上例9-2 到例9-4 三个例子全做出来,再验一次课件那张对照表。
已完成 0 / 8
本 次 上 机 题 目
  1. 01查当前会话的隔离级别
  2. 02把课件第 22 页那一幕做出来
  3. 03同样的操作,改成读已提交
  4. 04B 一提交,A 就跟着变
  5. 05换成可重复读,两次一定一样
  6. 06隔离级别不能在事务开着的时候改
  7. 07读也上锁,别人只能等
  8. 08四级挡住四种异常的表,自己核一遍
  9. 四个级别各跑一次同样的两句查询
01
第 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

重 点

SESSION 只改自己这一扇窗口,B 那边一点都没受影响。

分清楚两种写法

写法级别名怎么写
ISOLATION LEVEL空格隔开
=变量中间加短横

想一想

改成 GLOBAL 的话,B 这扇已经连着的窗口会跟着变吗?

02
第 9 章 · 上机三

把课件第 22 页那一幕做出来

读未提交,B 没提交 A 就读到了 600。

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

重 点

课件那张结果表里 account3 排在最前面,真机按主键排,account1 在前。

知道更多

最后让 B 回滚是为了把数据放回原样,后面几题还要用。

03
第 9 章 · 上机三

同样的操作,改成读已提交

只改一句 SET,脏数据就读不到了。

窗口 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 第二次读还是 500,B 那 100 元没提交就跟 A 无关。

练一练

这时候 B 执行 COMMIT,A 再查一次会怎样?
  1. A还是老数
  2. B变成 B 改过的数
  3. C看 A 什么时候开的事务
答案 B

读已提交只挡没提交的,一旦提交 A 立刻就能读到。

04
第 9 章 · 上机三

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

重 点

三次查询:老数、老数、新数,这就是不可重复读。

分清楚三个时机

什么时候查读到
改之前老数
改了没提交老数
提交之后新数
05
第 9 章 · 上机三

换成可重复读,两次一定一样

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 自己看得见自己改的,A 一直看的是开事务那一刻的快照。

知道更多

A 提交之后再查那一次才看得到 B 的改动,快照到此为止。

06
第 9 章 · 上机三

隔离级别不能在事务开着的时候改

开着事务去改级别,报 1568。

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

重 点

先结束事务再改级别,顺序反了就是 1568。

想一想

为什么不许在事务中途换级别?

07
第 9 章 · 上机三

读也上锁,别人只能等

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

重 点

A 只是查了一下,B 的 UPDATE 就得等 A 提交完,代价就是这个等。

知道更多

真机等到 innodb_lock_wait_timeout 那 50 秒还没轮到,就报 1205。

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

分清楚自己核

级别挡住几种
读未提交一种
读已提交两种
可重复读四种
串行化四种

练一练

MySQL 的可重复读挡不挡得住幻象读?
  1. A挡不住,标准这么定的
  2. B挡得住,InnoDB 的快照连行数也定住
  3. C看有没有加索引
答案 B

SQL 标准说挡不住,InnoDB 的一致性读实际挡得住,上机第六题验过。

第 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

重 点

前半段 A 读到 600,后半段读到 500,差别只在那一句 SET。

想一想

把后半段换成串行化,B 那句 UPDATE 会怎样?

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