前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL事务提交流程

MySQL事务提交流程

作者头像
用户7353950
发布2022-06-23 16:30:51
1K0
发布2022-06-23 16:30:51
举报
文章被收录于专栏:IT技术订阅IT技术订阅

有binlog的CR方式(重点核心!!): 有binlog情况下,commit动作开始时,会有一个Redo XID 的动作记录写到redo,然后写data到binlog,binlog写成功后,会将binlog的filename,日志写的位置position再写到redo(position也会写到pos文件里),此时才表示该事务完成(committed)。如果只有XID,没有后面的filename和position,则表示事务为prepare状态。 流程: commit; --> write XID to redo. --> write data to Binlog. --> write filename,postsion of binlog to redo. --> commited.

记录Binlog是在InnoDB引擎Prepare(即Redo Log写入磁盘)之后,这点至关重要。

如果事务在不同阶段崩溃,recovery时会发——

crash发生阶段

事务状态

事务结果

当事务在prepare阶段crash

该事务未写入Binary log,引擎层也未写redo到磁盘。

该事务rollback。

当事务在binlog写阶段crash

此时引擎层redo已经写盘,但Binlog日志还没有成功写入到磁盘中。

该事务rollback。

当事务在binlog日志写磁盘后crash,但是引擎层没有来得及commit

此时引擎层redo已经写盘,server层binlog已经写盘,但redo中事务状态未正确结束。

读出binlog中的xid,并通知引擎层提交这些XID的事务。引擎提交这些后,会回滚其他的事务,使引擎层redo和binlog日志在事务上始终保持一致。事务通过recovery自动完成提交。

总结起来说就是如果一个事务在prepare阶段中落盘成功,并在MySQL Server层中的binlog也写入成功,那这个事务必定commit成功。

(redolog 写成功 && binlog 写成功 == commit,缺一不可。)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术订阅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档