我们知道MySQL-Innodb中最重要的就是事务
事务的完整生命周期之前已经讲过了事务的完整生命周期
但是发现很多人对事务ID都有很大的误解。今天为大家详细说明一下。
事务ID最早是出现在什么时候?
当然是用户在客户端执行
begin;
并敲下 “回车” 的时候。
此时innodb会通过transaction.xid_state.xid.get_mysql_xid()来生成Transaction ID(即Xid)
而get_mysql_xid()则封装了
- mysql_xid_init(): 初始化Xid结构体,包括设置时间戳和服务器ID等信息。
- mysql_xid_next(): 获取下一个可用的Xid,即生成一个新的Transaction ID。
当然生成的Xid并不会直接记录到binlog中,而是先落到undo上,在事务结束时通过xid_event写入binlog文件中。
解析binlog文件即可看到每个事务的最后都有相应的Xid
需要注意的是:这里看到的Xid并不是原始的Xid,而是解析为16进制的Xid。
彩蛋
发现网上很多人都认为事务id是由query_id自增来的。
其实并不是,所谓的query_id是对每个连接到mysql的会话分配的id,通常开启general.log就可以看到。
同时很多人对Xid和trx_id也没有分清,关于trx_id及其作用可以查看这篇文章
MySQL-trx_id及其作用