我看过official documentation,但我仍然有些困惑。
假设我有一个程序,它运行并执行插入,然后我请求rake routes
,我是刚从我的程序运行实例完成插入的最后一个插入ID,还是最后一个插入任何被调用过程的实例/会话在表上的id?
例如,说最后插入的记录ID是4,我调用了该过程,我的插入将是id 5,但我的插入失败,我将返回4作为最后一个插入id或null / 0值?
答案 0 :(得分:3)
您在问题中提供的文档页面非常link有一个答案:
生成的ID在服务器上维护 每个连接基础。这意味着返回的值 给定客户端的函数是生成的第一个AUTO_INCREMENT值 对于影响AUTO_INCREMENT列的最新语句 客户。此值不受其他客户端的影响,即使它们也是如此 生成自己的AUTO_INCREMENT值。此行为可确保 每个客户端都可以检索自己的ID而无需担心 其他客户的活动,无需锁或 交易。
因此,其他客户没有竞争条件。您需要在与LAST_INSERT_ID()
相同的连接中请求INSERT
才能获得正确的结果。
至于回滚事务时会发生什么,它是未定义的:
如果前一个语句返回错误,则返回值 LAST_INSERT_ID()未定义。对于事务表,如果是 语句由于错误而回滚,值为 LAST_INSERT_ID()未定义。对于手动ROLLBACK,其值为 LAST_INSERT_ID()未恢复到事务之前的状态;它 仍然像ROLLBACK那样。
答案 1 :(得分:1)
您链接的文档说:
生成的ID基于每个连接在服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响
AUTO_INCREMENT
列的最新语句生成的第一个AUTO_INCREMENT
值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT
值。
这意味着您可以安全地依赖LAST_INSERT_ID()
返回的值。它是由调用LAST_INSERT_ID()
的相同代码实例生成的最新自动递增值。当然,您必须在要获取其值的INSERT
语句之后立即调用它,它不能返回最近的第二个INSERT
语句或更早的语句生成的值。