博客
关于我
MySQL两阶段提交、崩溃恢复与组提交
阅读量:383 次
发布时间:2019-03-05

本文共 1572 字,大约阅读时间需要 5 分钟。

两阶段提交与MySQL事务管理

两阶段提交

XA协议是分布式事务的重要规范,它通过将事务提交分为两个阶段来实现分布式事务的管理。这个过程被称为两阶段提交(2PC),具体包括以下两个阶段:

Prepare阶段

在prepare阶段,事务管理器(TM)向每个资源管理器(RM)发送prepare指令。资源管理器根据指令执行操作,并返回成功或失败的状态信息给事务管理器。如果任何一个资源管理器返回失败,事务就被标记为不可提交;否则,事务进入提交阶段。

Commit阶段

在commit阶段,事务管理器根据prepare阶段的结果,决定是否将事务提交。如果所有资源管理器都确认成功,事务管理器会向所有资源管理器发送commit指令;如果有任何一个失败,则向所有资源管理器发送roll back指令。

MySQL事务管理

MySQL中的XA事务管理可以分为内部XA和外部XA两种类型:

外部XA

外部XA用于跨多个MySQL实例的分布式事务,需要应用层作为协调者。这种方式支持崩溃时的悬挂事务,全局提交或回滚,需要应用层进行严格的实现。

内部XA

内部XA用于同一实例下跨多个引擎的事务,通常涉及InnoDB的binlog和redo log。通过内部XA,MySQL确保了主从环境的数据一致性。内部XA事务的提交同样分为两个阶段,解决了binlog和redo log的一致性问题。

二阶段提交详解

在实际实现中,InnoDB的二阶段提交机制需要详细理解以下过程:

Prepare阶段

在prepare阶段,InnoDB会持有prepare_commit_mutex,并对redo log进行写入和同步操作。同时,回滚段会被设置为Prepared状态,而binlog则不会执行任何操作。

Commit阶段

在commit阶段,InnoDB会对binlog进行写入和同步操作,然后执行事务提交,并释放prepare_commit_mutex。需要注意的是,binlog的写入与否决定了事务是否成功提交。

参数影响

InnoDB支持XA参数默认为true,表示启用XA模式。关闭该参数可能导致binlog写入顺序与实际事务提交顺序不一致,影响崩溃恢复和slave复制的准确性。因此,在启用log-bin时,若有多个线程对数据库进行修改,必须开启innodb_support_xa参数。

崩溃恢复

当MySQL实例发生崩溃时,系统需要进行崩溃恢复。恢复过程主要包括以下步骤:

崩溃恢复过程

  • 提取活跃事务从undo日志中恢复,undo日志中的临时表不受redo log保护。
  • 扫描最后一个binlog文件,提取其中的事务ID(xid)。
  • InnoDB维护了一个Prepare的事务链表,将这些事务的xid与binlog中的xid进行比较。如果binlog中存在对应的事务ID,则标记为已提交;否则,标记为回滚。
  • 恢复保证

    binlog每次切换前都会保证前一个binlog文件中的所有事务已经提交并完成redo log同步。因此,在崩溃恢复时,可以确保binlog和redo log的事务状态一致。

    binlog组提交

    为了提升性能,MySQL5.6引入了binlog组提交机制。传统的binlog写入在sync_binlog=1时会成为性能瓶颈,同时还需持有全局锁。组提交通过将写入和同步分为三个阶段来优化性能:

    组提交阶段

  • Flush阶段:将所有线程的binlog内容从缓存写入文件。
  • Sync阶段:对binlog文件执行fsync操作,确保数据写入磁盘。
  • Commit阶段:对每个线程执行引擎层的事务提交。
  • 每个阶段仅由一个线程执行,通过并发优化提升性能。

    通过以上机制,MySQL在事务管理、崩溃恢复和性能优化方面实现了显著提升,确保了高可用性和数据一致性。

    转载地址:http://nbrwz.baihongyu.com/

    你可能感兴趣的文章
    vue.js之过渡效果-css
    查看>>
    mpvue支持小程序的分包加载
    查看>>
    2020-2021:时间戳
    查看>>
    推荐书单4.0:测试工程师破局之路
    查看>>
    jmeter(十二)关联之正则表达式提取器
    查看>>
    http协议进阶(五)连接管理
    查看>>
    封装一个简易版的ajax操作对象
    查看>>
    隐藏Nginx软件版本号信息
    查看>>
    httpd: apr_sockaddr_info_get() failed for bogon
    查看>>
    OAuth2.0认证详解
    查看>>
    如何禁用控制台窗口的关闭按钮?
    查看>>
    004.Kickstart部署之FTP架构
    查看>>
    001. Ansible简介
    查看>>
    006.SQLServer AlwaysOn可用性组高可用部署
    查看>>
    Maven构建命令相关
    查看>>
    Windows下chm转换为html的超简单方法
    查看>>
    Unknown character set: 'utf8mb4'
    查看>>
    《SpringCloud实战项目》系列目录
    查看>>
    【Discuz】关闭QQ互联插件提示信息:系统繁忙,请稍后再试
    查看>>
    Netflix是什么,与Spring Cloud有什么关系
    查看>>