MySQL 源码系列问题回顾
在分享本期直播内容之前,秉承有始有终及严谨的作风,国庆老师就第一次分享
的关于《MySQL 源码系列》中的两个问题进行了补充与更正:
一、trigger 的 event 到底怎么回放的,为什么没有主键冲突?
上次分享时,介绍了 trigger trx 在 binlog 中 events 的顺序
gtid event
query event
table_map_event(table1)
table_map_event(table2)
rows_event(table1)
rows_event(table2)
xid_event
实际在 slave 进行回放的时候,他走的就不是 server 层的创建连接,执行语句了。
而是直接调用每个 event 中的 do_apply_event。比如 table map event,它会将表
的元信息保存起来。
到 write_rows_event 呢,slave 调用函数如下
|--do_exec_row
|--write_row
|-- handler::ha_write_row
|-- write_row
可以看到是调用了引擎层的 innodb::write_row 将数据插进去。
综上我们可以看到,trigger trx 在 slave 回放时,实际是绕过了 trigger,直接交
予存储引擎操作数据。因此也不会出现我们一开始说的,主键冲突的问题。
二、trx 实际的生成顺序
我 们 说 trx 是 由 event 构 成 的 。 比 如 insert 语 句 , 它 包 含 的 events 是
gtid_log_event, query_log_event,
table_map_log_event, write_rows_log_event, xid_log_event
我们说这些 events 是在最后 trx 提交的时候生成的,实际不是哈,他们的实际生
成顺序如下:
Gtid event, Xid event 是在 ordered_commit 函数里生成的。这个涉及到 binlog
和 redo log 的一致性写入问题。
table map event 在 binlog_write_table_map 函数中生成,它接收了参数 has
trans 标 志 是 否 是 事 务 , need_binlog_rows_query 是 否 要 生 成
rows_query_log_event
评论