数据库原理与应用 第 17 章 · 上机五
课程第 17 章上机五 起手式一坏全撤撤到哪儿关掉也是回滚课件的综合题一段完整的程序连续练习 版式
第 17 章 使用 Python 连接 MySQL 数据库 · 上机五

事务与一个完整的小程序

课件第 58 到 60 页那两件事:一笔事务要么全成要么全不成,连接最后一定要关。
已完成 0 / 6
本 次 上 机 题 目
  1. 01装驱动、进解释器、连上库
  2. 02第二条撞外码,第一条也不留
  3. 03撤回上一次 commit 之后
  4. 04close 之前没 commit,一样没了
  5. 05插一个、改一个、查一批
  6. 06try / except / finally 三段都写全
  7. 自己写一个:加一门课再选上
01
第 17 章 · 上机五

装驱动、进解释器、连上库

最后一页讲事务:要么全成,要么一件不留。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

connector 一连上就在事务里,所以不 commit 谁也看不见。

知道更多

第 9 章那个 autocommit,在 Python 这边默认是关着的。

02
第 17 章 · 上机五

第二条撞外码,第一条也不留

rollback 撤的是这一整笔,不是最后一句。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

第一条本来是好的,被第二条连累,一起撤了回去。

关键术语

原子性Atomicity
一笔事务里的几件事要么全做,要么全不做

知道更多

1452 是外码查无此人,第 5 章撞过一次,这里换成 Python 又撞一次。

想一想

把两条 INSERT 分成两个 try,结果会怎样?

03
第 17 章 · 上机五

撤回上一次 commit 之后

commit 是分界线,rollback 只往回撤到那儿。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

60 留下了,90 撤掉了,分界线就是中间那句 commit。

打个比方

commit 像存档,rollback 是读档,只能读回最近那一次。

想一想

如果中间那句 commit 不写,最后查出来是多少?

04
第 17 章 · 上机五

close 之前没 commit,一样没了

跟第三份上机那一题是同一件事,换个角度再看一遍。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

rowcount 报了 1,重新连上来一查还是 60,那一笔在关闭时被撤了。

知道更多

真机上进程被杀掉、网线被拔掉,结果都一样,没提交的一律不算。

想一想

为什么数据库要这么设计?

05
第 17 章 · 上机五

插一个、改一个、查一批

一次连接做三件事,前两件要 commit,第三件不用。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

改数据的两句包在一个 try 里,查数据的那句放在外面。

知道更多

把 SELECT 也塞进 try 不报错,只是没必要,它本来就不会改坏数据。

想一想

为什么第一句 DELETE 要单独 commit?

06
第 17 章 · 上机五

try / except / finally 三段都写全

finally 里关连接,不管成没成都关得掉。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

finally 里的两句一定跑得到,连接不会因为出错就漏在那儿。

记牢它三段

  1. try 干活
  2. except 收拾
  3. finally 关门

知道更多

课件里 close 写在 except 里,跑通的那一路反而不关,这是个坑。

想一想

不关连接,短时间内看得出问题吗?

第 17 章 · 上机五

自己写一个:加一门课再选上

自己开一条连接,两句 INSERT 包成一笔,跑完自己关。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

自己开连接自己关,前面几题关成什么样都不影响,能连着跑两遍。

知道更多

两句 INSERT 的顺序不能反,先有课才选得上,反了就撞 1452。

想一想

把两句 INSERT 调个个儿,报的是哪个错误号?

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