显示定义ID
表定义的自增值ID达到上限后,在申请下一个ID时,得到的值保持不变
-- (2^32-1) = 4,294,967,295 -- 建议使用 BIGINT UNSIGNED CREATE TABLE t (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY) AUTO_INCREMENT=4294967295; INSERT INTO t VALUES (null); -- AUTO_INCREMENT没有改变 mysql> SHOW CREATE TABLE t; +-------+------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------+ | t | CREATE TABLE `t` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8 | +-------+------------------------------------------------------+ mysql> INSERT INTO t VALUES (null); ERROR 1062 (23000): Duplicate entry '4294967295' for key 'PRIMARY'
InnoDB row_id
1、如果创建的InnoDB表没有指定主键,那么InnoDB会创建一个不可见的,长度为6 Bytes的row_id
2、InnoDB维护一个全局的dict_sys.row_id值,所有无主键的InnoDB表,每插入一行数据
3、代码实现上,row_id是一个8 Bytes的BIGINT UNSIGNED
4、在InnoDB里面,申请到row_id=N后,就将这行数据写入表中
5、推荐显示创建自增主键
XID
1、redolog和binlog相配合的时候,有一个共同的字段XID,对应一个事务
2、生成逻辑
3、global_query_id是一个纯内存变量,重启之后清零
4、global_query_id是8 Bytes,上限为2^64-1
InnoDB trx_id
1、XID是由Server层维护的
2、InnoDB内部使用的是trx_id,为的是能够在InnoDB事务和Server层之间做关联
3、InnoDB内部维护一个max_trx_id的全局变量
4、InnoDB数据可见性的核心思想
5、对于正在执行的事务,可以通过information_schema.innodb_trx看到事务的trx_id
操作序列
时刻 | session A | session B |
---|---|---|
T1 | BEGIN; SELECT * FROM t LIMIT 1; |
|
T2 | USE information_schema; SELECT trx_id,trx_mysql_thread_id FROM innodb_trx; |
|
T3 | INSERT INTO t VALUES (null); | |
T4 | SELECT trx_id,trx_mysql_thread_id FROM innodb_trx; |
-- T2时刻 mysql> SELECT trx_id,trx_mysql_thread_id FROM innodb_trx; +-----------------+---------------------+ | trx_id | trx_mysql_thread_id | +-----------------+---------------------+ | 281479812572992 | 30 | +-----------------+---------------------+ -- T4时刻 mysql> SELECT trx_id,trx_mysql_thread_id FROM innodb_trx; +-----------------+---------------------+ | trx_id | trx_mysql_thread_id | +-----------------+---------------------+ | 7417540 | 30 | +-----------------+---------------------+ mysql> SHOW PROCESSLIST; +----+-----------------+-----------+--------------------+---------+--------+------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------+--------------------+---------+--------+------------------------+------------------+ | 4 | event_scheduler | localhost | NULL | Daemon | 344051 | Waiting on empty queue | NULL | | 30 | root | localhost | test | Sleep | 274 | | NULL | | 31 | root | localhost | information_schema | Query | 0 | starting | SHOW PROCESSLIST | +----+-----------------+-----------+--------------------+---------+--------+------------------------+------------------+
1、trx_mysql_thread_id=30就是线程ID,即session A所在的线程
2、T1时刻,trx_id的值其实为0,而很大的值只是为了显示用的(区别于普通的读写事务)
3、T2时刻,trx_id是一个很大的数字,因为在T1时刻,session A并未涉及更新操作,是一个只读事务
4、session A在T3时刻执行INSERT语句时,InnoDB才真正分配trx_id
只读事务
1、在上面的T2时刻,很大的trx_id是由系统临时计算出来的
2、同一个只读事务在执行期间,它的指针地址是不会变的
3、如果有多个并行的只读事务,每个事务的trx变量的指针地址肯定是不同的
4、加上2^48的目的:保证只读事务显示的trx_id值比较大,用于区别普通的读写事务
5、trx_id与row_id的逻辑类似,定义长度为8 Bytes
6、只读事务不分配trx_id的好处
7、max_trx_id会持久化存储,重启不会重置为0,只有到达2^48-1的上限后,才会重置为0
thread_id
1、SHOW PROCESSLIST的第一列就是thread_id
2、系统保存了一个环境变量thread_id_counter
3、thread_id_counter定义为4 Bytes,因此达到2^32-1后就会重置为0
do { new_id= thread_id_counter++; } while (!thread_ids.insert_unique(new_id).second);
参考资料
《MySQL实战45讲》
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。
本文向大家介绍Mysql join联表及id自增实例解析,包括了Mysql join联表及id自增实例解析的使用技巧和注意事项,需要的朋友参考一下 join的写法 如果用left join 左边的表一定是驱动表吗?两个表的join包含多个条件的等值匹配,都要写道on还是只把一个写到on,其余写道where部分? 执行结果: 由于表b没有索引,使用的是Block Nexted Loop Join(B
问题内容: 我们希望从mySQL获取一个自动递增的ID,而无需实际存储它,直到其他与mysql不相关的进程成功完成为止,这样,如果发生异常或应用程序崩溃,就不会存储该条目。我们需要使用ID作为其他进程的密钥。本质上,我们要“保留”自动增量,并将最后一行插入到mySQL中。我们不希望在知道整个过程成功完成之前插入任何行。 可以在mySQL中进行这种自动增量保留吗? 注意:我了解SQL事务。但是,我们
本文向大家介绍form自动提交实例讲解,包括了form自动提交实例讲解的使用技巧和注意事项,需要的朋友参考一下 在做项目中,例如b2b的由商城跳往卖家中心的后台,当他既有会员账号又是卖家的时候,让他登录了商城,就不需要卖家登录的时候,处理过程中可以用到form表单自动登录。 实现简单思路:可以再普通会员登录的地方,登录成功可以将登录名和密码,用户id存起来,为了安全可以aes加密(前面一篇文章有详
本文向大家介绍python增加矩阵维度的实例讲解,包括了python增加矩阵维度的实例讲解的使用技巧和注意事项,需要的朋友参考一下 numpy.expand_dims(a, axis) Examples 以上这篇python增加矩阵维度的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
本文向大家介绍mysql insert语句操作实例讲解,包括了mysql insert语句操作实例讲解的使用技巧和注意事项,需要的朋友参考一下 insert的语法 如果列清单和VALUES清单均为空清单,则INSERT会创建一个行,每个列都被设置为默认值: 假设worker表只有name和email,插入一条数据 批量插入多条数据 给出要赋值的那个列,然后再列出值的插入数据 使用set插入数据 在
主要内容:1.InnoDB系统自增row_id,2.Xid,3.Innodb trx_id,4.thread_id,5.Redis自增主键,6.总结1.InnoDB系统自增row_id 如果你创建的 InnoDB 表没有指定主键,那么 InnoDB 会给你创建一个不可见的,长度为 6 个字节的 row_id。InnoDB 维护了一个全局的 dict_sys.row_id 值,所有无主键的 InnoDB 表,每插入一行数据,都将当前的 dict_sys.row_id 值作为要插入数据的 row_i
主要内容:1.InnoDB系统自增row_id,2.Xid,3.Innodb trx_id,4.thread_id,5.Redis自增主键,6.总结1.InnoDB系统自增row_id 如果你创建的 InnoDB 表没有指定主键,那么 InnoDB 会给你创建一个不可见的,长度为 6 个字节的 row_id。InnoDB 维护了一个全局的 dict_sys.row_id 值,所有无主键的 InnoDB 表,每插入一行数据,都将当前的 dict_sys.row_id 值作为要插入数据的 row_i
我正在我的GTX 1060 6gb上使用Python中的Tensorflow 1.2训练LSTM。 在每个时代,我用这种方法保存模型: 一切正常,但在九个时代之后,当我试图用这种方法保存模型时,我得到了ResourceExhaustedError。 我在培训期间检查了我的资源,但没有耗尽任何资源。 我得到的错误如下: 2017-06-29 12:43:02.865845: W tenstorflo