|mysql_execute_command|--trans_commit|----ha_commit_trans|------MYSQL_BIN_LOG::prepare// 开启 binlog prepare 和 innodb prepare|--------ha_prepare_low// Binlog prepare:获取上一个事务最大的 sequence number 时间戳|----------bin
*/commit_stage:/* binlog_order_commits:是否进行 order commit,即保持 redo 和 binlog 的提交顺序一致 */if((opt_binlog_order_commits || Clone_handler::need_commit_order()) && (sync_error ==0|| binlog_error_action != ABORT_SERVER)) {if(change_stage(thd, Commit_stage_manager::COMMIT_...
binlog_transaction_dependency_tracking是设在主库,可以取commit_order,writeset,writeset_session,主要是控制binlog文件中last_committed的计算方式: commit_order即group commit,同在prepare阶段的事务,在binlog中last_committed数值一样,传到从库之后可以并行执行; writeset,会对事务处理的行数据哈希出一个writeset值,...
Commit 阶段的功能实现主要集中在MYSQL_BIN_LOG::ordered_commit函数中。 Flush 阶段 首先看下Stage 0和Stage 1,stage 0主要是 8.0 新增的一个阶段,主要是针对从库保证 commit order。stage 1就是大家耳熟能详的 Commit 阶段的三个小阶段其一的 Flush 阶段了: int MYSQL_BIN_LOG::ordered_commit(THD *thd, ...
Commit_order_manager::register_trx ->cs::apply::Commit_order_queue::push 其中主要完成的步骤为将分配的worker的信息记录到node中,同时根据m_commit_sequence_generator生成器生成一个提交序列(本bug就是和这个生成器有关,重启实际上是重置了这个内存计数器),每个事务都会让这个计数器加1。并且将这个worke...
通过类Commit_order_trx_dependency_tracker的两个成员变量来基本实现:m_max_committed_transaction,保存已提交的最大事务号;m_transaction_counter,保存已prepare的最大事务号。 获取last_committed与sequence_number值 如上图所示,实现该功能的是get_dependency函数,把last_committed与sequence_number的绝对值转换成相对值...
MySQL 参数解析 slave_preserve_commit_order slave_preserve_commit_order 参数在多线程复制环境下,能够保证从库回放relay log事务的顺序与这些事务在relay log中的顺序完全一致,也就是与主库提交的顺序完全一致。 举个例子,开启并行复制后,如果relay log中有3个事务A,B,C,他们在relay log中的顺序是A->B->C,...
对于commit_order特点: 8.1 每次事物提交seq number增加1 8.2 last commit 在前面的binlog准备阶段就赋予值给了每个事物 8.3 last commit 是前一个commit队列的最大seq number 其次seq number和last commit这2个值类型都为logical_clock,其中维护了一个叫做offsets偏移量的值,用来记录每次binary log切换时sequence_nu...
在MySQL中,其实是通过函数来处理并行复制的,函数叫order_commit,当我们要提交事务的时候,会调用order_commit这个函数,这个函数的功能是将事务加入到队列中。而事务的提交过程,一共涉及三个队列,分别是flush队列、sync队列、以及commit队列。 下面介绍这三个队列: ...
如果需要按顺序提交: order_commits: 7.1. sync队列加入commit队列, 第一个进入的 sync 队列的leader为本阶段的leader, 其他sync队列加入commit队列的leader会被阻塞, 直到 commit阶段后被leader线程唤醒, 进入 finish commit 7.2. 释放 Lock sync mutex,获取 lock commit mutex ...