MySQL中的两阶段提交详解(2PC)

2025-05-12 14:50

本文主要是介绍MySQL中的两阶段提交详解(2PC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MySQL中的两阶段提交详解(2PC)》:本文主要介绍MySQL中的两阶段提交(2PC),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教...

引言

在InnoDB存储引擎中,当启用二进制日志(Binlog)且执行事务提交时,会触发两阶段提交(2PC)过程,以确保数据的一致性和持久化安全

该过程首先将数据更新写入redo log buffer和Binlog缓存,然后通过分阶段的日志写入和持久化操作,实现事务的准备与提交状态转变。

两阶段提交机制不仅协调了InnoDB的事务日志与Binlog之间的同步,还依赖于关键配置参数如sync_binlog和innodb_flush_log_at_trx_commit,这些参数分别控制Binlog和redo log的写入与持久化策略。

本文将围绕两阶段提交的具体流程及相关配置,深入分析其在保证事务原子性和持久性中的核心作用。

两阶段提交过程

当在 InnoDB 中执行事务,并且启用了 Binlog 时,提交事务时会触发两阶段提交过程

  • 当有数据需要更新的时候,InnoDB 引擎就会先把记录写到redo log buffer以及binlog cache(线程独有的),并更新内存(change buffer),这个时候更新就算完成了。
  • 如果是唯一索引更新操作会写入到redo log buffer,普通索引的更新操作会先写入到change buffer,在合适的时机merge到redo log。
  • 事务提交时写入 redo log 并变成 prepare 状态。(一阶段)
  • 再把 binlog cache 写到 binlog 文件中,最后 redo log 变成 commihttp://www.chinasem.cnt 状态。(二阶段android

MySQL中的两阶段提交详解(2PC)

sync_binlog配置

sync_binlog 用于控制commit时binlog的持久化,write表示将binlog cache中的日志,写入到文件系统的 page cacwww.chinasem.cnhe,fChina编程sync将表示数据持久化到磁盘。

  • sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync。(5.7及以前默认值)
  • sync_binlog=1 的时候,表示每次提交事务都会执行 fsync。(8.0及以后默认值)
  • sync_binlog=N(N>1)的时候,表示每次提交事务都 write,但累积 N 个事务后才 fsync。

MySQL中的两阶段提交详解(2PC)

innodb_flush_log_at_trx_commit配置

innodb_flush_log_at_trx_commit 用于控制commit时redo log的持久化。

  • innodb_flush_log_at_trx_commit=0 的时候,表示每次事务提交时都只是把 redo log 留在 redojavascript log buffer 中。
  • innodb_flush_log_at_trx_commit =1 的时候,表示每次事务提交时都将 redo log 直接持久化到磁盘。(默认值)
  • innodb_flush_log_at_trx_commit=2 的时候,表示每次事务提交时都只是把 redo log 写到 page cache。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程China编程(www.chinasem.cn)。

这篇关于MySQL中的两阶段提交详解(2PC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154583

相关文章

SQL Server 查询数据库及数据文件大小的方法

《SQLServer查询数据库及数据文件大小的方法》文章介绍了查询数据库大小的SQL方法及存储过程实现,涵盖当前数据库、所有数据库的总大小及文件明细,本文结合实例代码给大家介绍的非常详细,感兴趣的... 目录1. 直接使用SQL1.1 查询当前数据库大小1.2 查询所有数据库的大小1.3 查询每个数据库的详

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

springboot整合mqtt的步骤示例详解

《springboot整合mqtt的步骤示例详解》MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,适用于物联网设备之间的通信,本文介绍Sprin... 目录1、引入依赖包2、yml配置3、创建配置4、自定义注解6、使用示例使用场景:mqtt可用于消息发

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据