本文介绍了“MySQL源代码系列有哪些问题?”很多人在实际案例的操作中会遇到这样的困难。让边肖带领你学习如何处理这些情况。希望大家认真阅读,学点东西!
一.trigger的event到底怎么回放的,为什么没有主键冲突?
上次分享的时候,我在binlog中介绍了trigger trx的事件顺序。
gtid事件
查询事件
table_map_event(表1)
table_map_event(表2)
rows _ event(表1)
rows _ event(表2)
xid_event
实际上是奴隶。
回放的时候,他没有拿服务器层的创建连接,而是执行了语句。相反,它在每个事件中直接调用do_apply_event。例如,表映射事件将保存表的元信息。
要写入_ rows _ event,slave调用以下函数。
| - do_exec_row
| - write_row
|-handler : ha _ write _ row
| - write_row
可以看到引擎层的innodb:write_row被调用。
插入数据。
综上所述,我们可以看到触发trx。
当从机回放时,它实际上会绕过触发器,直接将数据提交给存储引擎进行操作。所以不会出现我们开头说的主键冲突的问题。
第二,trx。
的实际生成顺序。
我们说trx由事件组成。例如,insert语句包含gtid_log_event、query_log_event,
table_map_log_event,write_rows_log_event,xid_log_event
我们说这些事件是在trx提交时生成的,但实际上它们不是。它们的实际生成顺序如下:
Gtid事件和Xid事件在ordered_commit函数中生成。这涉及到binlog和重做日志的一致写入。
表格映射事件
在binlog_write_table_map函数中生成,其中接收的参数有trans,标志是否为事务,需要_binlog_rows_query,是否生成rows_query_log_event。
在函数binlog_write_table_nap中。
在函数中,调用binlog_start_trans_and_stmt在此函数中生成query_log_event。
最后,调用write事件。
生成的事件缓存在thd的binlog_chache中。
生成订单: table _ map _ log _ event,query _ log _ event,[row _ query _ log _ event]。
缓存顺序: query _ log _ event,[row _ query _ log _ event],table _ map _ log _ event。
然后生成xid事件,最后在ordered_commit函数中生成gtid事件。
声明
格式:
没有table_map_event。
和row_event生成顺序。
生成顺序:query_log_event (save语句)、query_log_event(begin)、xid事件、gtid事件。
binlog_write_table_map
在中生成table_map_event,使用table_map_log_event的另一个构造函数从table对象中获取表信息,构造table_map_log_event。
然后调用binlog_start_trans_and_stmt生成query _ log _ event(query _ log中设计的常规trx和xa用例),再调用cache_data的write_event写事件。
这里介绍一下“MySQL源代码系列有哪些问题”的内容。感谢阅读。如果你想了解更多行业,关注网站,边肖将为大家输出更多高质量的实用文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/53574.html