我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么理解MySQL事务两段式提交

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么理解MySQL事务两段式提交

本篇内容主要讲解“怎么理解MySQL事务两段式提交”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解MySQL事务两段式提交”吧!

⒈两段式提交的目的:解决参与者(redo log & binlog)的一致性

⒉两段式提交的原理:实际是防止参与方(资源管理者)部分提交(在binlog 与 redo log中,如果提交前redo log准备好,而binlog没准备好,直接提交,则binlog可能写失败;如果binlog准备,redo log没准备好,就会导致提交丢失)

⒊两段式提交的两个阶段:

第一阶段:为prepare阶段,TM(事务管理器)向RM(资源管理器)发出prepare指令,RM进行操作,然后返回成功与否的信息给TM;

第二阶段:为事务提交或者回滚阶段,如果TM收到所有RM的成功消息,则TM向RM发出提交指令;不然则发出回滚指令

⒋Binlog/Redo XA在MySQL版本的演变:

⑴5.5版本:

①第一阶段(innodb prepare)

持有prepare_commit_mutex

将undo状态改为prepare状态

将redo write/fsync回磁盘

binlog不做任何操作

②第二阶段(commit)

write/sync_binlog

innodb_commit(写入COMMIT标志后,释放prepare_commit_mutex互斥量)

这里有一个并发的缺陷就是prepare_commit_mutex这个互斥量,贯穿提交两阶段

⑵5.6版本:

①第一阶段(innodb prepare)

持有prepare_commit_mutex

将undo状态改为prepare状态

将redo write/fsync回磁盘

binlog不做任何操作

释放prepare_commit_mutex

②第二阶段(commit)

分为三个队列,分为三个小阶段(每一个阶段是一个队列,进入每个队列都有一个互斥量保护,有leader事物领导操作)

flush阶段:leader将一组事物的binlog 写入IOcache

sync阶段:将binlog sync磁盘

commit阶段:根据参数binlog_order_commits的设定,进行提交

分为三阶段的优势是:拆分了之前的mutex,增加了并发性

但是redo log仍然是不能组提交

⑶5.7版本:

①第一阶段(innodb prepare)

持有prepare_commit_mutex

将undo状态改为prepare状态

将lsn记录到thd数据结构的lsn

binlog不做任何操作(这里如果是开启了GTID,就获取lock_interval的起始逻辑时钟,用于MTS的重放)

释放prepare_commit_mutex

②第二阶段(提交阶段)

分为三个队列,分为三个小阶段(每一个阶段是一个队列,进入每个队列都有一个互斥量保护,由leader事物线程领导操作)

⑴flush stage阶段:

leader事物线程搜集flush队列,找出最大的LSN,然后将redo log write/flush磁盘到这个最大的LSN

write binlog,将binlog写入IO缓存

⑵sync阶段:

将binlog刷入磁盘

⑶commit阶段:

根据参数binlog_order_commits的设定,进行提交

优势:将历史redo在prepare阶段的write/sync改到了flush state,这样就能进行redo的组提交

⒌Binlog/Redo XA在参数的调整:

flush阶段:

binlog_max_flush_queue_time:5.7.9之前的版本可用,flush队列等待的时间

sync阶段:

binlog_group_commit_sync_delay:在进入sync阶段所等待的时间

binlog_group_commit_sync_no_delay_count:binlog_group_commit_sync_delay毫秒直到收集到binlog_group_commit_sync_no_delay_count个事务时,进行一次组提交;

commit阶段:

binlog_order_commits:控制binlog是否按照顺序提交

到此,相信大家对“怎么理解MySQL事务两段式提交”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么理解MySQL事务两段式提交

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么理解MySQL事务

这篇“怎么理解MySQL事务”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么理解MySQL事务”文章吧。事务指逻辑上的一组
2023-06-26

怎么在golang中实现mysql数据库事务的提交与回滚

这期内容当中小编将会给大家带来有关怎么在golang中实现mysql数据库事务的提交与回滚,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。golang适合做什么golang可以做服务器端开发,但golang
2023-06-14

怎么解决plsql因事务未提交造成的锁表问题

本篇内容主要讲解“怎么解决plsql因事务未提交造成的锁表问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决plsql因事务未提交造成的锁表问题”吧!1、执行以下语句可查询被锁的表 se
2023-06-22

java常见分布式事务理论怎么解决

本篇内容介绍了“java常见分布式事务理论怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!CAP理论先从定义开始:C(Consiste
2023-06-21

怎么理解高并发下的数据库分布式事务

这篇文章主要介绍“怎么理解高并发下的数据库分布式事务”,在日常操作中,相信很多人在怎么理解高并发下的数据库分布式事务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解高并发下的数据库分布式事务”的疑惑有所
2023-06-02

编程热搜

目录