mysql 组提交 (Group Commit) 三阶段流程

网友投稿 751 2022-05-29

MYSQL_BIN_LOG::ordered_commit() ← 执行事务顺序提交,binlog group commit的主流程 | |-#########>>>>>>>>> ← 进入Stage_manager::FLUSH_STAGE阶段 |-change_stage(..., &LOCK_log) | |-stage_manager.enroll_for() ← 将当前线程加入到m_queue[FLUSH_STAGE]中 | | | | ← (follower)返回true | |-mysql_mutex_lock() ← (leader)对LOCK_log加锁,并返回false | |-finish_commit() ← (follower)对于follower则直接返回 | |-ha_commit_low() | |-process_flush_stage_queue() ← (leader)对于follower则直接返回 | |-fetch_queue_for() ← 通过stage_manager获取队列中的成员 | | |-fetch_and_empty() ← 获取元素并清空队列 | |-ha_flush_log() | |-flush_thread_caches() ← 对于每个线程做该操作 | |-my_b_tell() ← 判断是否超过了max_bin_log_size,如果是则切换binlog文件 | |-flush_cache_to_file() ← (follower)将I/O Cache中的内容写到文件中 |-RUN_HOOK() ← 调用HOOK函数,也就是binlog_storage->after_flush() | |-#########>>>>>>>>> ← 进入Stage_manager::SYNC_STAGE阶段 |-change_stage() |-sync_binlog_file() | |-mysql_file_sync() | |-my_sync() | |-fdatasync() ← 调用系统API写入磁盘,也可以是fsync() | |-#########>>>>>>>>> ← 进入Stage_manager::COMMIT_STAGE阶段 |-change_stage() ← 该阶段会受到binlog_order_commits参数限制 |-process_commit_stage_queue() ← 会遍厉所有线程,然后调用如下存储引擎接口 | |-ha_commit_low() | |-ht->commit() ← 调用存储引擎handlerton->commit() | | ← ### 注意,实际调用如下的两个函数 | |-binlog_commit() | |-innobase_commit() |-process_after_commit_stage_queue() ← 提交之后的后续处理,例如semisync | |-RUN_HOOK() ← 调用transaction->after_commit | |-stage_manager.signal_done() ← 通知其它线程事务已经提交 | |-finish_commit()

在 enroll_for() 函数中,刚添加的线程如果是队列的第一个线程,就将其设置为 leader 线程;否则就是 follower 线程,此时线程会睡眠,直到被 leader 唤醒 (m_cond_done) 。

mysql 组提交 (Group Commit) 三阶段流程

注意,binlog_max_flush_queue_time 参数已经取消。

MySQL 任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:#化鲲为鹏,我有话说# + 鲲鹏ARM服务器芯片主要存在以下挑战
下一篇:深度实践OpenStack:基于Python的OpenStack组件开发—2.1.4PyCharm的安装与配置
相关文章