MySQL执行COMMIT操作时Group Commit组提交是如何工作的

云雪小哥_3772

云雪小哥_3772

2026-10-10

395人浏览

原创

mysql commit 语句本身不触发组提交,真正起作用的是 ordered_commit() 函数实现的 flush、sync、commit 三阶段流水线调度,通过 leader-follower 机制将并发事务批量处理,仅由 leader 执行 fsync 等耗时操作,从而大幅提升吞吐。

mysql执行commit操作时group commit组提交是如何工作的

MySQL 的 COMMIT 操作本身不直接触发组提交;真正起作用的是 ordered_commit() 函数在 Binlog 层对事务提交流程的三阶段调度——Flush、Sync、Commit,且必须满足特定参数组合才实际生效。

为什么 COMMIT 语句看起来“串行”但实际能组提交?

执行 COMMIT 时,InnoDB 先完成 prepare(写 redo log),再交由 MySQL Server 层调用 MYSQL_BIN_LOG::ordered_commit()。这个函数不等每个事务单独走完 fsync,而是把同时到达的事务按阶段排队:第一个进队的变成 leader,其余为 follower,leader 统一执行耗时操作,follower 等通知即可返回。

  • 事务不会卡在 COMMIT 语法层面,而是卡在 ordered_commit() 的某个阶段队列里(比如 Sync 阶段等待 leader 调用 fsync(binlog))
  • 如果所有事务都很快完成 prepare 并几乎同时进入 Flush 阶段,就容易凑成大组;反之,若事务执行时间差异大,或锁争用严重,follower 可能早早就超时退出队列,导致组变小甚至退化为单事务提交
  • COMMIT 返回成功 ≠ 数据已落盘,只是表示该事务已被 leader 收编并承诺会随组一起持久化

sync_binlog 和 innodb_flush_log_at_trx_commit 怎么掐住组提交的命门?

这两个参数决定事务是否真能“排队等打包”。只要其中任意一个强制每事务刷盘,leader 就没机会攒人。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • sync_binlog = 1 + innodb_flush_log_at_trx_commit = 1 → 每个事务都要求 fsync redo 和 binlog,ordered_commit() 的 Sync 阶段形同虚设,组提交退化为串行,TPS 可能腰斩
  • 推荐生产搭配:sync_binlog = 1(保主备一致) + innodb_flush_log_at_trx_commit = 2(redo 只写 OS cache),这样 Binlog 层仍有打包空间,InnoDB 层也不拖后腿
  • innodb_flush_log_at_trx_commit = 0 虽吞吐高,但崩溃可能丢 1 秒事务,仅适合从库或日志可丢场景;sync_binlog = 0 完全不可控,主库禁用

怎么确认组提交真在干活,而不是配置写了就完事?

别信配置文件,查运行时状态变量才是唯一验证方式。

  • SHOW GLOBAL STATUS LIKE 'Binlog_group_commit_trigger_count'; —— 这个值持续上涨,说明有事务被成功打包;长期为 0 表示组提交压根没启动
  • Binlog_group_commit_trigger_lock_wait 持续涨 → 事务卡在 MDL 锁或行锁上,根本没走到提交队列,leader 等不到人
  • Binlog_group_commit_trigger_timeout 每秒涨几十次 → binlog_group_commit_sync_delay 设太大(如 500000 微秒),小事务被迫等满才发车,延迟爆炸
  • 用 pt-query-digest 看慢日志时,重点筛 Query_time 短但 Lock_time 长的语句——它们就是拖垮整组的“钉子户”

binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 怎么调?

这两个参数控制“发车策略”,是 or 关系:满足任一即触发刷盘,但调得过激会牺牲延迟。

  • binlog_group_commit_sync_delay = 10000(10ms)+ binlog_group_commit_sync_no_delay_count = 10 是较平衡起点;高吞吐低延迟场景可压到 1000~5000 微秒
  • 设成 500000(500ms)是典型错误——P99 延迟直接抬升半秒,用户感知明显卡顿
  • binlog_group_commit_sync_delay = 0 时,binlog_group_commit_sync_no_delay_count 失效,相当于“人不满也发车”,组变小,吞吐下降
  • 调整后必须观察 Binlog_group_commit_trigger_count 是否上升,以及 Com_commit 与 Handler_commit 的比值是否趋近于组大小(如比值 ≈ 8,说明平均每组 8 个事务)

组提交不是开个开关就自动生效的魔法,它高度依赖事务到达节奏、锁竞争状况和两个关键刷盘参数的配合。最容易被忽略的是:即使参数配对正确,若业务 SQL 存在长锁等待或大事务阻塞,follower 根本等不到进队就超时退出,整个机制就空转。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2153

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1319

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

775

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2932

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4928

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1119

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5191

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4582

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6034

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习