MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
17746 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

12 | 事务:怎么确保关联操作正确执行?

你好,我是朱晓峰。
我们经常会遇到这样的场景:几个相互关联的数据操作,必须是全部执行,或者全部不执行,不可以出现部分执行的情况。比如说,你从微信账号里提现 100 元到银行卡上,这个动作就包括了相互关联的 2 个步骤,首先是微信账号减 100 元,然后是银行卡账号加 100 元(这里假设没有手续费)。假如因为某种异常,这 2 个操作只执行了一个,另外一个没有执行,就会出现你的钱少了 100 元,或者你的钱多了 100 元的情况,这肯定是不能接受的。
如何才能确保多个关联操作全部执行呢?这时就要用到事务了。接下来我就重点讲一讲什么是事务,以及如何正确使用事务。

什么是事务?

事务是 MySQL 的一项功能,它可以使一组数据操作(也叫 DML 操作,是英文 Data Manipulation Language 的缩写,包括 SELECT、INSERT、UPDATE 和 DELETE),要么全部执行,要么全部不执行,不会因为某种异常情况(比如硬件故障、停电、网络中断等)出现只执行一部分操作的情况。
事务的语法结构如下所示:
START TRANSACTION 或者 BEGIN (开始事务)
一组DML语句
COMMIT(提交事务)
ROLLBACK(事务回滚)
我解释一下这几个关键字。
START TRANSACTION 和 BEGIN:表示开始事务,意思是通知 MySQL,后面的 DML 操作都是当前事务的一部分。
COMMIT:表示提交事务,意思是执行当前事务的全部操作,让数据更改永久有效。
ROLLBACK:表示回滚当前事务的操作,取消对数据的更改。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了事务在数据库操作中的重要性以及如何确保关联操作的正确执行。作者首先解释了事务的概念和语法结构,包括START TRANSACTION、COMMIT和ROLLBACK等关键字的用法。然后通过一个超市销售场景的例子,说明了如何利用事务的原子性来确保数据的一致性,并提醒了读者在使用事务时需要注意错误处理和回滚,以避免数据不完整的情况发生。此外,文章还介绍了在存储过程中如何使用事务进行监控和处理错误。另外,文章还详细讨论了MySQL中的事务隔离性,包括四种不同的隔离等级及其应用场景。最后,作者强调了正确设置事务的隔离等级对并发操作的重要性,并提出了一些思考题,引发读者对事务的深入思考和讨论。整体而言,本文通过实际场景和示例生动地阐述了事务的重要性和正确使用方法,对读者快速了解事务的概念和操作具有很好的指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • 朱晓峰
    置顶
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了什么是索引、如何创建和使用索引。下面是思考题的答案: 我会用门店编号、销售日期、商品编号、销售金额和毛利这些字段,分别创建索引,理由是这些字段经常会被用作筛选条件来进行查询。
    2021-04-21
    4
  • giteebravo
    学了这节课,还真不敢说自己知道什么是事务!

    作者回复: 课上内容认真学习,课下多操作练习,一定可以掌握的

    2021-04-04
    9
  • lesserror
    每一讲都有收获。 课后思考题的答案已经在总结的第一段话中给出了。 关于MVCC和锁是面试的常见问题。本专栏侧重入门。这部分内容看《MySQL实战45讲》和书籍《MySQL是怎样运行的》。 以上资料都认真看了,基本应对数据库的问题可以做到胸有成竹了!

    作者回复: 不错

    2021-04-03
    5
  • 洛奇
    文中,张三和张三爱人消费会员卡购物的例子里,正确的事务隔离级别应该是SERIALIZABLE吗?其他的三个隔离级别,我认为都存在发生错误的可能性。比如,默认的可重复读的隔离级别下,两个事务一起并行执行时,都只会取到100元,两个事务提交后,会员卡余额变成0,但消费了两次!

    作者回复: 是的,涉及到金额,建议采用最高级别SERIALIZABLE

    2021-04-05
    4
    3
  • SharpBB
    1.什么是事务? 说白了 两件相关联的事情 要么都执行成功 要么都执行失败 若失败 得做相应的回滚操作 2.四个特性 原子性:表示事务中的操作要么全部执行,要么全部不执行,像一个整体,不能从中间打断。 一致性:表示数据的完整性不会因为事务的执行而受到破坏。 隔离性:表示多个事务同时执行的时候,不互相干扰。不同的隔离级别,相互独立的程度不同。 持久性:表示事务对数据的修改是永久有效的,不会因为系统故障而失效。 3.隔离等级 READ UNCOMMITTED:可读取事务中未提交的数据 a开启事务 更新了数据将钱变为1000 未提交事务 b去查询 发现钱多了1000 a后来发现转错人了 回滚事务 提交 b再去查询 钱没了 白高兴一场 READ COMMITTED:只能读取事务中已经提交更改的数据 a开启事务 查询余额为1000 去消费 此时未提交事务 此时b开启事务 将钱转走了 提交事务 a 付钱 发现没钱了 REPEATABLE READ:默认级别 开启事务可以避免其他人进行修改 但是无法避免新增操作 可以避免a开启事务后查询数据时 外界对该数据的修改操作 但是a开启事务 查询信用卡账单为1000元 b开启事务 去消费了一波 200元 提交事务 等a打印单子时 账单为1200元 以为出现了幻觉 也就是说在开启事务期间 发现数据多了 SERIALIZABLE:最高级别 开启事务可以限制任何人操作 直到事务结束

    作者回复: 好的

    2022-02-10
    2
  • Devo
    “数据操作,要么全部正确执行,要么全部失败”,我认为不对。数据操作的正确性依赖于事务隔离级别,如果在rc下,那么事务A的执行过程中就有可能读取到其它事务的提交结果,从而导致数据计算错乱,所以在数据操作的场景下务必要根据业务场景设计好事务隔离级别,避免数据计算错乱,望老师指正。

    作者回复: 请参考公布的思考题答案

    2021-04-07
    2
    2
  • Geek_ieee754
    请问作者大大: START TRANSACTION; INSERT INTO mytrans(transid,itemnumber,quantity) VALUES(1,5); UPDATE inventory SET invquantity = invquantity - 5 WHERE itemnumber = 1; COMMIT; 我写了这条之后,insert执行会被卡住,并不会执行之后的update,和文中不一致,这是为何?

    作者回复: 可以检查一下有没有其他进程在访问数据库

    2021-11-10
    2
    1
  • kimoti
    如何防止死锁?

    作者回复: 这个议题比较大,可以通过订阅丁奇老师的《MySQL实战》课了解更多相关知识

    2021-11-05
    2
    1
  • 彭彬
    “计算完成之后,你也不要忘记把隔离等级恢复到系统默认的状态,否则,会对日常的系统营运效率产生比较大的影响。” 老师:这句话不理解。一个事务完成了,锁就释放了,怎么还会影响其他事务呢?

    作者回复: 这里指的是隔离等级,如果不恢复,会对其他的事物产生影响。

    2021-09-22
  • SevenMonths
    事务隔离级别得深入理解下。 https://developer.aliyun.com/article/743691

    作者回复: MySQL的官方文档,更加权威一些。

    2021-09-01
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部