版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23864697/article/details/88286888
自增ID因为存在类型而存在上限
一 表定义自增ID值
达到上限后,再申请一个ID时,值保持不变,最后报主键冲突
create table t(id int unsigned auto_increment primary key) auto_increment=4294967295;
insert into t values(null);
// 成功插入一行 4294967295
show create table t;
/* CREATE TABLE `t` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967295;
*/
insert into t values(null);
//Duplicate entry '4294967295' for key 'PRIMARY'
二 InnoDB系统自增row_id
达到上限之后,从新开始写,写的时候如果存在,则覆盖
三 Xid
Mysql 内部维护了一个全局变量global_query_id,每次执行都将把它赋值给query_id,然后给这个变量加1,如果当前语句是这个事务执行的第一个语句,还会赋值给这个事务的Xid。
global_query_id重启之后清0;
理论上,同一个binlog里是不会出现同一个Xid的情况
理论不存在(因为2的64次方太大了):
1 执行一个事务,假设Xid是A
2 接下来执行2的64次查询,让global_query_id回到A
3 再启动一个事务,这个事务的Xid也是A
四 Innodb trx_id
五 thread_id
达到上限的时候,重置为0.然后继续增加,但是不会重复
do {
new_id= thread_id_counter++;
} while (!thread_ids.insert_unique(new_id).second);