背景

跟同学聊到row_id一个边界问题,这里详细说明下。

InnoDB表若没有定义主键,会使用系统的一个默认递增row_id (dict_sys->row_id)作为主键。每次插入一行加1,到达最大值循环复用。

需要注意的是,虽然dict_sys->row_id 被定义为一个unsigned long long, 但由于这个主键值只有6个字节,因此最大值是2^48。 row_id超过这个值还是会递增,只是写入的时候只取低位,可以认为是做取模操作。

问题

这就涉及到一个问题,一个长期运行的MySQL里,如果频繁插入删除行(像日志类的表),即使最终表规模不是很大,仍可能会出现值row_id重用。而我们知道作为主键值,是不能重复的。

假设出现这种情况,在一个表里,新插入的一行的row_id与某一个年代久远的行的row_id出现冲突,会肿么样?

验证

其实本来这里只需要一个结论。本文的目的还是跟大家探讨一种验证的方法。有了上面的信息,我们可以考虑设计如下的复现步骤:

1) 创建一张无主键空表

2) gdb设置dict_sys->row_id为1

3) 往空表插入若干行

4) gdb设置dict_sys->row_id为2^48

5) 再插入若干行

6) 看结果

结论

可以看到,行(1),(2)被覆盖了。

比较合理点的方案应该是像MySQL的表内自增主键一样,报个duplicate-key error.

总结

更多相关文章

  1. 发现 developer.android.com 官网的一个单词错误:
  2. 背部如何画好?动漫人物背部画法步骤
  3. android 命令(adb shell)进入指定模拟器或设备
  4. Android--WebView+HTML+Javascript
  5. Android绘制简单折线图的步骤
  6. Android(安卓)Junit 单元测试步骤
  7. Android(安卓)TextToSpeech语音播放文本
  8. Android中LiveData+Room+Paging简单实现步骤
  9. android sdk支持ant自动构建jar步骤

随机推荐

  1. [微信支付] 服务端PHP开发纪要
  2. php变量函数,回调函数
  3. PHP里为啥会有session_start()这个函数?
  4. 使用phpnow本地搭建Discuz!如何实现伪静
  5. 使用JOIN获取有关两个用户的信息
  6. Yii 访问 Gii(脚手架)时出现 403 错误
  7. MySQL将IP存储为int以获得更高的性能? [重
  8. ThinkPhp框架 分页 和session验证的使用
  9. PHP之网络编程
  10. 迭代文件夹中的CSV文件,并使用PHP将数据加