数据库原理与应用 第 9 章 · 上机一
课程第 9 章上机一 认认两扇窗开一笔撤一笔提交就撤不回整笔转账转到一半关掉自动提交增删也能撤连起来 版式
第 9 章 数据库并发控制与封锁 · 上机一

事务的起停与原子性

七道题走一遍开事务、回滚、提交和自动提交这四件事。
已完成 0 / 7
本 次 上 机 题 目
  1. 01先确认两扇窗口连的是同一台服务器
  2. 02START TRANSACTION 开头,ROLLBACK 全部撤销
  3. 03COMMIT 之后再 ROLLBACK 什么也不会发生
  4. 04把课件上那七句敲一遍
  5. 05改完第一户就回滚,钱一分没少
  6. 06SET autocommit=0 之后一直在事务里
  7. 07INSERT 和 DELETE 一样在事务管辖之内
  8. 自己走一遍完整的转账并验算
01
第 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

重 点

没开事务的时候每一句自己就是一笔事务,敲完立刻落地,B 马上看得见。

想一想

A 那句 UPDATE 后面并没有写 COMMIT,为什么 B 也看得到?

02
第 9 章 · 上机一

START TRANSACTION 开头,ROLLBACK 全部撤销

事务里改了三行,一句 ROLLBACK 三行一起回去。

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

重 点

ROLLBACK 撤的是这一笔事务里全部的改动,不是最后一句。

记牢它三个动作

  1. START 开
  2. COMMIT 存
  3. ROLLBACK 撤
03
第 9 章 · 上机一

COMMIT 之后再 ROLLBACK 什么也不会发生

一句 COMMIT 就是分水岭,前面的全部落地。

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

重 点

COMMIT 之后事务就结束了,这时候的 ROLLBACK 根本不在任何事务里。

练一练

COMMIT 之后紧跟一句 ROLLBACK,account3 会变回 900 吗?
  1. A
  2. B不会
  3. C看隔离级别
答案 B

提交是不可逆的。要留后路就别急着 COMMIT。

04
第 9 章 · 上机一

把课件上那七句敲一遍

六步操作加一句 COMMIT,转完两户合计还是 1400。

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

重 点

转账前后两户合计一分不差,一致性说的就是这个数不动。

知道更多

这台终端的 now() 每叫一次往前走一秒,所以两句写回的时间不一样。

05
第 9 章 · 上机一

改完第一户就回滚,钱一分没少

只做完扣款那一半,ROLLBACK 之后 500 原封不动。

窗口 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 从头到尾看到的还是原来的。

想一想

如果这时候机房断电,重启之后 account1 是多少?

06
第 9 章 · 上机一

SET autocommit=0 之后一直在事务里

不写 COMMIT,改了多少 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

重 点

关掉之后每次 COMMIT 完马上又开一笔新的,窗口一直在事务里。

分清楚两种开事务

写法什么时候结束
START TRANSACTIONCOMMIT 一次
autocommit=0一直续下去
07
第 9 章 · 上机一

INSERT 和 DELETE 一样在事务管辖之内

插一行删一行,ROLLBACK 之后两样都没发生过。

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

重 点

事务管的是所有改数据的语句,不只是 UPDATE。

知道更多

建表改表那些 DDL 不一样,它们会顺手把当前事务提交掉,撤不回来。

第 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

重 点

两扇窗口的合计从头到尾一样,一笔事务做到哪一步都不破坏它。

想一想

把最后的 COMMIT 换成 ROLLBACK,B 那边会有什么不同?

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