【问题标题】:LAST_INSERT_ID() how it works at multi-users environmentLAST_INSERT_ID() 如何在多用户环境中工作
【发布时间】:2011-08-15 16:39:21
【问题描述】:

先检查那个问题:
Inserting an automatically generated index from a table into another table
我知道这个函数“LAST_INSERT_ID()”做了所需的
问题是:我在 php 脚本中使用它,如果某个用户在“table1”中插入数据,而在他将“id”插入“table2”之前,另一个用户将数据插入“table1”...那么哪个“ id”函数会检索第一个用户、他的 id 还是第二个用户“最后一个”的 id??
我希望检索用户自己“第一个用户”插入的“id”,所以如果它没有实现怎么办?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    LAST_INSERT_ID() 为您提供执行它的连接上最后一个自动生成的 id,它不返回 MySQL 服务器全局生成的最后一个插入 id。

    【讨论】:

    • 在查询之后立即调用它也是(非常)好的做法。这样你就不会错了。如果您在这样做时遇到问题,您可能需要重新考虑您的代码。
    • 注意:每个 MySQL 连接只属于一个用户,所以是一对一的关系。在这种情况下,lastInsertId 将始终返回用户的最后一个自动生成的 id。但是对于共享 MySQL 连接,您必须使用 transaction 来获得正确的lastInsertId,因为共享连接具有一对多的关系。
    【解决方案2】:

    永远不要将 lastInsertId() 与 PostgreSQL 序列一起使用,尤其是当您的应用程序的插入/更新负载很高时。 PostgreSQL 序列是非事务性的(一种自然的设计功能,可以避免排他锁定,否则会产生不可接受的性能)。这意味着任何增加相同序列的并发事务都会使 lastInsertId() 返回的值相对于事务的最后插入无效。示例:

    Transaction 1 inserts with nextval('some_seq') yielding 100;
    Concurrent transaction 2 inserts with nextval('some_seq') yielding 101;
    Transaction 1 calls lastInsertId(), expecting 100, BUT GETS 101.
    

    这种 PDO 方法对于 PostgreSQL 来说是个脑残,总是使用 INSERT ... RETURNING 代替。问候。

    Source

    【讨论】:

    • 这是如何回答问题的?问题是关于 MySQL 函数 LAST_INSERT_ID(),它被明确标记为 mysql 而不是 postgresql
    猜你喜欢
    • 2010-12-06
    • 2012-05-29
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2014-11-16
    • 2019-01-19
    • 2021-04-17
    • 2020-02-06
    相关资源
    最近更新 更多