mysql 系统变量binlog_transaction_dependency_tracking
控制事务依赖模式,让从库根据主库写入binlog中的 commit timestamps 或者 write sets 并行回放事务(引入该参数之后,binlog的格式记录的内容中增加了时间戳和write sets信息),此参数在MySQL 5.7.22 版本引入(>=8.0.1)
- 有三个取值:
- COMMIT_ORDER:使用 5.7 本来就支持的Group commit 的方式决定事务依赖
- WRITESET:使用 WriteSet 的方式决定判定事务直接的冲突,发现冲突则依赖冲突事务,否则按照 COMMIT_ORDER 方式决定依赖
- WRITESET_SESSION:在 WRITESET 方式的基础上,保证同一个 session 内的事务不可并行
- PS:
- WRITESET 是一个 hash 数组,大小由参数 binlog_transaction_dependency_history_size 决定,参数 transaction_write_set_extraction 决定 hash 算法,可选值:OFF、MURMUR32、XXHASH64,默认值 XXHASH64,如果WriteSet 记录了事务的更新行信息,决定 commit_parent时,使用事务自己的 session WriteSet 和 history WriteSet 进行比对,找到最近的冲突行,设为 commit_parent。如果 WriteSet 找不到 commit_parent,则还是使用 COMMIT_ORDERE 决定 commit_parent
- 如果transaction_write_set_extraction为OFF,则binlog_transaction_dependency_tracking变量的值只能设置为COMMIT_ORDER,设置其他值会报错。另外,如果binlog_transaction_dependency_tracking的当前值为WRITESET或WRITESET_SESSION,则无法更改transaction_write_set_extraction的值
slave_preserve_commit_order 参数在多线程复制环境下,能够保证从库回放relay log事务的顺序与这些事务在relay log中的顺序完全一致,也就是与主库提交的顺序完全一致。
举个例子,开启并行复制后,如果relay log中有3个事务A,B,C,他们在relay log中的顺序是A->B->C,而它们的last_commited相同,也就是说他们可以并行回放,那么在从库上,这3个事务,提交的顺序可能就不再是A->B->C,设置slave_preserve_commit_order=ON,能够保证这3个事务,在从库回放时,仍然按照它们在relay log中的顺序来回放,保证从库回放relay log事务的顺序与主库完全相同。