mysql事务prepare_mysql之 事务prepare 与 commit 阶段分析

打开binlog选项后,执行事务提交命令时,就会进入两阶段提交模式。两阶段提交分为prepare阶段和commit两个阶段。流程如下 :这里面涉及到两个重要的参数:innodb_flush_log_at_trx_commit和sync_binlog,参数可以设置不同的值,具体可以查看mysql的帮助手册。我这里设置的是双一模式(innodb_flush_log_at_trx_commit=1,sync_binlog=1),不同的模式区别在于,写文件调用write和落盘fsync调用的频率不同,所导致的后果是mysqld 或 os crash后,不严格的设置可能会丢失事务的更新。双一模式是最严格的模式,这种设置情况下,单机在任何情况下不会丢失事务更新。

prepare阶段:

1.设置undo state=TRX_UNDO_PREPARED; //trx_undo_set_state_at_prepare调用

2.刷事务更新产生的redo日志;【步骤1产生的redo日志也会刷入】

commit阶段:

1.将事务产生的binlog写入文件,刷入磁盘;

2.设置undo页的状态,置为TRX_UNDO_TO_FREE或TRX_UNDO_TO_PURGE; // trx_undo_set_state_at_finish调用

3.记录事务对应的binlog偏移,写入系统表空间; //trx_sys_update_mysql_binlog_offset调用

下面这部分是我抽象出来的源码调用部分,大家可以通过单步调试方式,在关键函数中设置断点,来详细了解这个过程。

===========

prepare阶段

MYSQL_BIN_LOG::prepare

ha_prepare_low

{

engine:

binlog_prepare

innobase_xa_prepare

mysql:

trx_prepare_for_mysql

{

1.trx_undo_set_state_at_prepare //设置undo段的标记为TRX_UNDO_PREPARED

2.设置事务状态为TRX_STATE_PREPARED

3.trx_flush_log_if_needed //将产生的redolog刷入磁盘

}

}

============

commit阶段

MYSQL_BIN_LOG::commit

ordered_commit

{

1.FLUSH_STAGE

flush_cache_to_file // 刷binlog

2.SYNC_STAGE

sync_binlog_file //Call fsync() to sync the file to disk.

3.COMMIT_STAGE

ha_commit_low

{

binlog_commit

innobase_commit

trx_commit(trx)

{

trx_write_serialisation_history(trx, mtr); //更新binlog位点,设置undo状态

trx_commit_in_memory(trx, lsn); //释放锁资源,清理保存点列表,清理回滚段

}

}

}

mysqld可能在任何情况下crash,os也有可能出现问题,另外若机器掉电,mysqld也会同样挂掉。但是即使这样,mysql仍然能保证数据库的一致性。接下来,我会结合上述流程,分析二阶段提交如何保证这点的。下面给出几种常见的场景,

1.prepare阶段,redo log落盘前,mysqld crash

2.prepare阶段,redo log落盘后,binlog落盘前,mysqld crash

3.commit阶段,binlog落盘后,mysqld crash

对于第一种情况,由于redo没有落盘,毫无疑问,事务的更新肯定没有写入磁盘,数据库的一致性受影响;对于第二种情况,这时候redo log写入完成,但binlog还未写入,事务处于TRX_STATE_PREPARED状态,这是提交还是回滚呢?对于第三种情况,此时,redo log和binlog都已经落盘,只是undo状态没有更新,这种情况也应该提交,因为redo log和binlog已经一致了,当然这只是我的假设,需要通过源码逻辑来验证。

下面给出了mysqld异常重启后的执行逻辑以及关键的源代码。对于第三种情况,我们可以搜集到未提交事务的binlog event,所以需要提交,与我们假设相符;而对于第二种情况,由于binlog未写入,需要通过执行回滚操作来保证数据库的一致性。

异常重启后,如何判断事务该提交还是回滚

1.读binlog日志,获取崩溃时没有提交的event; //info->commit_list中含有该元素

2.若存在,则对应的事务要提交;否则需要回滚。

判断事务提交或回滚源码如下:

上面讨论了两阶段提交的基本流程,以及服务器异常crash后,mysql如何重启恢复保证binlog和数据的一致性。简而言之,对于异常的xa事务,若binlog已落盘,则事务应该提交;binlog未落盘,则事务就应该回滚。由于这块涉及到的源代码较多,我也没有看完所有源代码,如有不正确的地方,欢迎指正。

//异常重启后,回滚流程

innobase_rollback_by_xid

rollback_by_xid

trx_rollback_resurrected

trx_rollback_active

row_undo

{

//从回滚页获取undo记录

//分析undo记录类型

if (insert)

row_undo_ins

else

row_undo_mod

}

//异常重启后,提交流程

commit_by_xid

trx_commit_for_mysql

//写binlog接口

handler.cc:binlog_log_row

sql/binlog.cc:commit

mysys/my_sync:my_sync

sql/binlog.cc:sync_binlog_file

handler/ha_innodb.cc:innobase_xa_prepare

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

order by 子查询_【框架】118:mybatis之多表高级查询

今天是刘小爱自学Java的第118天。感谢你的观看,谢谢你。学习内容安排如下:补充说明知识点:resultMap,sql片段。mybatis中的高级查询,即多表关联查询。查询主要分为:一对一,一对多,多…

小程序使用css变量,小程序使用css变量实现“换肤”方案

使用sass,stylus可以很方便的使用变量来做样式设计,其实css也同样可以定义变量,在小程序中由于原生不支持动态css语法,so,可以使用css变量来使用开发工作变简单。基础用法page {--main-bg-color: brown;}.one {color: white;backg…

笔试MySQL读写速度优化_笔试题:优化mysql数据库的方法

优化mysql数据库的方法,(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率(2).系统架构设计方面,表散列,把海量数据散列到几个不…

css找某个元素的下个子元素,CSS可以检测一个元素有多less个子元素?

注:这个解决scheme将返回一定长度的子集,而不是你所要求的父元素。 希望它仍然有用。安德烈路易斯提出了一个方法: http : //lea.verou.me/2011/01/styling-children-based-on-their-number-with-css3/不幸的是,它只适用于IE9及以…

python文本聚类分析_python机器学习kmeans算法——对文本进行聚类分析

#!/usr/bin/env python#-*- coding: utf-8 -*-#File : kmeans.py#Author: 田智凯#Date : 2020/3/19#Desc :机器学习kmeans算法,对科技成果项目进行聚类分析 from __future__ importprint_functionimporttimefrom sklearn.feature_extraction.text importTfidfVector…

lock字段mysql_MySQL的lock tables和unlock tables的用法(转载)

早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定。但是具体如何用,怎么用,不太清楚。今天详细研究了下,总算搞明白了2者的用法。lock tables 命令…

css中变形,css3中变形处理

transfrom功能在css3 中可以使用transfrom功能实现文字或图像的旋转,缩放,倾斜,移动等变形处理deg是css3中使用的一种角度单位。旋转: 使用rotate方法,在参数中加入角度值,在角度值后要加上角度单位deg。旋…

获取 子文件夹 后缀_后期制作老司机教你一键批量生成项目文件夹

我猜你的项目工程是这样的,当你老板说去修改一下之前几个月的工程的时候,你都不知道哪个工程才是最终版呀。乱糟糟的工程而且当你打开工程的时候,wo艹,素材怎么丢失了~~不管是后期制作者还是平常我们日常工作,一定要养…

mysql排序行号_mysql 取得行号后再排序

一.理论准备Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射…

ffmpeg将文件转码后推向服务器,使用 Serverless 云函数 + ffmpeg 实现音视频转码服务...

核心价值视频应用、社交应用等场景下,用户上传的图片、音视频的总量大、频率高,对处理系统的实时性和并发能力都有较高的要求。例如:对于用户上传的视频短片,我们可以使用多个云函数对其分别处理,对应不同的清晰度(108…

python 怎么判断字符串是否有换行_JAVA中如何判断一个字符串是否换行

展开全部${rr.right_name}扩展资料 java控制台程序判断String字符e68a8462616964757a686964616f31333431373263串中只输入了一个回车: importjava.io.BufferedReader; importjava.io.InputStreamReader; importjava.util.Scanner; publicclassTest{ publicstaticvoi…

python提取文本中的字符串到新的txt_Python实现jieba对文本分词并写入新的文本文件,然后提取出文本中的关键词...

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。 Python实现jieba对文本分词并写入新的文本文件,然后提取出文本中的关键词思想 先对文本进行读写操作,利用jieba分词对待分词…

logger 参数列表过长_[源码级解析] 巧妙解决并深度分析Linux下rm命令提示参数列表过长的问题...

在维护实习单位服务器的过程中,偶然发现一个有350万文件的文件夹需要清理,于是我习惯性执行了rm -rf ./*,却在数秒后被告知“参数列表过长”。在一番折腾过后,我终于通过取巧的办法完成了这一任务,也随着相关内核源码的…

collect的功能是什么?其底层如何实现的?_为什么你要用 Spring ?

前言现在Spring几乎成为了Java在企业级复杂应用开发的代名词,得益于Spring简单的设计哲学和其完善的生态圈,确实为廉颇老矣,尚能饭否的 Java 带来了“春天”,有很多同学刚接触Java就直接从Spring框架开始学习,导致产生…

2.3.0配置 spark_配置scala 2.11.12的spark-2.3.0 maven依赖项的问题

我在尝试在POM.xml中为spark-scala应用程序设置maven denpendency时遇到问题 .我在用 :SCALA版本$ scalaWelcome to Scala 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_162).SPARK版本:$ ./spark-shellWelcome to SPARK version 2.3.0Using Scala ver…

m3u8合并mp4软件_m3u8格式转mp4究极办法!

你们来这个号这么久了!还没给你们分享过一些实用的干货。打今天起这个公众号将给大家推荐一些APP和实用的小软件和一些小教程。生命太短,没时间留给遗憾。若不是终点,都不要把自己留在原地,请一直微笑向前!我是帮忙坏哥…

android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...

先上效果图:制作过程是先起一个模拟器,然后把GifCam的框拖到模拟器上面,点击Rec的new先,然后点击Rec,然后就save到本地成gif文件这里做一个左右旋转,上下旋转,和左右移动的动画,先自己建立一个View的类&…

vm虚拟机安装包_一次Miniconda虚拟机安装的神奇踩坑记录

本人一直都是在物理机环境下使用Anaconda,好处是提供了比较完全的机器学习包,还有方便的虚拟环境,缺点是体积太大。但如果直接用Anaconda中的根目录环境作为pycharm中的Python解释器,因为在运行程序前会不断加载根目录中的Python包…

css3弧形跑道效果_Css 实现漂亮弧形

在实现页面五花八门的有特色的ui时,我们有时会遇到要用实现一个弧形,而这样的弧形要怎么实现呢?用图片?好像不大现实,因为这样就要无故多加载一张图片了,这里我们来说说怎么用css的after伪类来实现弧形。先…

python螺旋圆的绘制_python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)...

插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进、后退、左转、右转,乌龟的尾巴朝下,它移动时就会画一条线。并且为了增加乌龟画图的艺术价值…