MySQL 100%获取上次插入id last_insert_id();

MySQL 100%获取上次插入id last_insert_id();,mysql,Mysql,MySQL有LAST_INSERT_ID()获取最后一次插入的函数 但这并不安全:如果我运行某个查询,然后获取LAST\u INSERT\u ID(),然后在这两个查询之间执行另一个查询,我可能会获取错误的ID 这可能发生在使用同一连接的多个线程中,或者使用pconnect(多用户的持久连接) 有没有安全的方法来获取我想要的100%的ID 感谢使用SELECT Max(ID)FROM table比使用SELECT last_insert_ID()更安全吗?在SELECT last_insert_

MySQL有
LAST_INSERT_ID()获取最后一次插入的函数

但这并不安全:如果我运行某个查询,然后获取
LAST\u INSERT\u ID()
,然后在这两个查询之间执行另一个查询,我可能会获取错误的ID

这可能发生在使用同一连接的多个线程中,或者使用pconnect(多用户的持久连接)

有没有安全的方法来获取我想要的100%的ID

感谢使用SELECT Max(ID)FROM table比使用SELECT last_insert_ID()更安全吗?在SELECT last_insert_ID()中,它们作为两个单独的查询运行? 根据您的问题,表必须有主键。
因此,您可以从MAX(ID)获取最后一条记录。

在以下情况下,存储过程可能会有所帮助:

Create table test (id int AUTO_INCREMENT primary key, name varchar(50) )
存储过程如下:

delimiter $$
DROP PROCEDURE IF EXISTS InserData$$
CREATE PROCEDURE InserData(IN _Name VARCHAR(50))
BEGIN
    START TRANSACTION;
    INSERT INTO test(name) VALUES (_Name);
    SELECT LAST_INSERT_ID() AS InsertID;
    COMMIT;
END
使用调用存储过程

 CALL InserData('TESTER')
尝试一下,因为我们有事务语句,但它不能确保在多线程环境中的价值


链接解释它将根据每个连接模型工作。

回答:除非您有来自同一连接的多个线程执行插入操作,否则您不必担心任何问题。是的,这是我的问题,我有多个具有相同连接的进程,在副本中没有多个线程的答案,谢谢你可以编辑如果它不好我没有一个答案给你。我认为获得写锁可能会起作用,但写锁只会阻止其他会话,而不会阻止共享同一连接的多个线程。也许您应该尽量避免这种情况的发生。您需要在应用程序中实现互斥,以防止它们的干扰。或者每个线程都应该使用自己的连接。这并不能解决问题。我插入id=5的行,在我得到select max(id)之前,有人插入id=6,我得到id=6的行,这将是不正确的。您不应该回答问题