MySQL 和自动增量一致性

Posted

技术标签:

【中文标题】MySQL 和自动增量一致性【英文标题】:MySQL and Autoincrement Consistency 【发布时间】:2012-04-12 16:45:29 【问题描述】:

我想在插入后立即获取表的自动增量 ID。 LAST_INSERT_ID() 应该可以工作,但它是 100% 完整的证明吗?这意味着如果在存储过程中同时执行两个语句,它将使用该上下文中的最后一个 ID,还是来自已建立的其他连接?

INSERT INTO foo (auto,text)
    VALUES(NULL,'text');         # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    VALUES(LAST_INSERT_ID(),'text');  # use ID in second table

【问题讨论】:

【参考方案1】:

mysql 手册是这么说的

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

重要 如果使用单个 INSERT 语句插入多行,LAST_INSERT_ID() 返回为第一个插入的值生成的值 仅行。这样做的原因是为了让重现成为可能 很容易对其他服务器执行相同的 INSERT 语句。

LAST_INSERT_ID() 的值将在所有版本中保持一致 如果 INSERT 或 UPDATE 语句中的所有行都成功。

当前执行的语句不影响 LAST_INSERT_ID()。

如果前面的语句返回错误,则 LAST_INSERT_ID() 的值未定义。对于事务表,如果 语句由于错误而回滚,值为 LAST_INSERT_ID() 未定义。对于手动回滚,值 LAST_INSERT_ID() 不会恢复到事务之前的状态;它 保持在 ROLLBACK 时的状态。

所以是的,这是最好的方法,前提是您使用单个插入查询而不是分组查询

【讨论】:

以上是关于MySQL 和自动增量一致性的主要内容,如果未能解决你的问题,请参考以下文章

Docker安装canalmysql进行简单测试与实现redis和mysql缓存一致性

MySQL:ID号自动递增的不一致

Redis缓存双写一致性

Eurake源码分析(十一) 增量获取

2019-06-24 MySQL备份相关工具与命令

[Spring cloud 一步步实现广告系统] 15. 监听Binlog 增量索引准备