MySQL 运维实战课
张新铭(俊达)
云掣科技资深数据库专家,前淘宝网、支付宝数据库专家
961 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 32 讲/共 41 讲
MySQL 运维实战课
15
15
1.0x
00:00/00:00
登录|注册

30|事务怎么回滚?(上)

你好,我是俊达。
事务是关系型数据库的核心功能,具有 ACID 的特征。一个事务中的修改,要么全部生效,要么全部不生效,即使数据库异常崩溃,也不会违反事务的 ACID 属性。
上一讲中我们介绍了用来保证对数据库的修改都不丢的 Redo 机制。这一讲,我们来看一下,MySQL 怎么做到“事务中的修改,要么都生效,要么都不生效”,实际上 MySQL 使用了 Undo 来实现事务的回滚。

事务简介

MySQL 中,事务的行为受参数 autocommit 影响。如果 autocommit 设置为 ON(这个参数默认就是 ON),那么每个 SQL 语句会组成单独的事务,SQL 语句执行完成时,InnoDB 自动提交或回滚事务。
autocommit 设置为 ON 时,你也可以使用 BEGIN 或 START TRANSACTION 语句开启事务,开启事务后,可以在一个事务中执行多条 SQL 语句,你需要执行 COMMIT 语句提交事务,或使用 ROLLBACK 语句回滚事务。
如果事务中的 SQL 执行时报错了,MySQL 会怎么处理呢?如果是遇到了死锁,InnoDB 会回滚整个事务。如果是遇到了锁等待超时,那么默认设置下,会回滚最后的那个 SQL 语句。如果把参数 innodb_rollback_on_timeout 设置为 ON,那么锁等待超时后,会回滚整个事务。如果遇到其 SQL 报错,一般情况下都是回滚报错的那个 SQL 语句。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. MySQL中的事务行为受参数autocommit影响,可以通过BEGIN或START TRANSACTION语句开启事务,需要使用COMMIT或ROLLBACK语句结束事务。 2. InnoDB使用Undo来实现事务的回滚,对于不同的SQL操作(INSERT、UPDATE、DELETE),需要保存相应的Undo记录,以便在回滚时撤销事务所做的全部修改。 3. 从MySQL 8.0开始,InnoDB将Undo存储到了独立的Undo表空间中,避免了以前版本中因大事务或Undo Purge速度慢导致的系统表空间膨胀的问题。 4. Undo表空间文件格式包括回滚段数组页、回滚段和Undo段,每个Undo表空间最多可容纳128个回滚段,每个回滚段最多分配1024个Undo段。 5. Undo记录保存在Undo表空间中,通过Undo记录的页面编号和Undo记录在页面内的偏移,可以找到构建上一个行版本需要的Undo记录。

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

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部