trx_start_low//mysql 事务开始
trx_sys_get_new_trx_id
MYSQL_BIN_LOG::recover //恢复
commit_by_xid
rollback_by_xid
xarecover_handlerton
ha_recover
thd->transaction.xid_state.xid.set(thd->query_id);
用一个简单的更新语句来说明log_sys以及ib_logfile的更新内容的过程。假设我们的更新只涉及到非索引的固定长度字段。
a) 在bufferpool中写入undo log。 对于一个单一的语句,需要先创建一个undolog头。
b) 在bufferpool中写入undo log的实际内容。
c) 在log_sys->buf中写入buffer page的更新内容。此处保存了更新的完整信息。
d) 在log_sys->buf中写入启动事务(trx_prepare)的日志
e) 将c、d更新的log内容写入ib_logfile中。
f) 在log_sys->buf中写入事务结束(trx_commit)的日志
g) 将f步骤的log内容写入ib_logfile中。
buf_pool->stat.n_pages_created++
row_upd_rec_in_place //redo log for update
btr_cur_upd_lock_and_undo //undo log for update
MYSQL_BIN_LOG::do_write_cache( //写binglog的地方
Query_log_event::write(IO_CACHE* file), 生成 binglog内容