数据库系统作为一个可能需要 7*24 小时全年无休的服务,考虑这些边界是非常有必要的。每种自增 id 有各自的应用场景,在达到上限后的表现也不同:

  • 表的自增 id 达到上限后,再申请时它的值就不会改变,进而导致继续插入数据时报主键冲突的错误。
  • row_id 达到上限后,则会归 0 再重新递增,如果出现相同的 row_id,后写的数据会覆盖之前的数据。
  • Xid 只需要不在同一个 binlog 文件中出现重复值即可。虽然理论上会出现重复值,但是概率极小,可以忽略不计。
  • InnoDB 的 max_trx_id 递增值每次 MySQL 重启都会被保存起来,所以我们文章中提到的脏读的例子就是一个必现的 bug,好在留给我们的时间还很充裕。
  • thread_id 是我们使用中最常见的,而且也是处理得最好的一个自增 id 逻辑了。

原文:https://time.geekbang.org/column/article/83183