Mysql 在多处理环境中,last_insert_id是否返回正确的自动增量id?

Mysql 在多处理环境中,last_insert_id是否返回正确的自动增量id?,mysql,perl,multiprocessing,Mysql,Perl,Multiprocessing,以下是我的web应用程序中的一些简化代码: sub insert { my $pid = fork(); if ($pid > 0) { return; } else { &insert_to_mysql(); my $last_id = &get_last_inserted(); # call mysql last_inserted_id exit(0); } } f

以下是我的web应用程序中的一些简化代码:

sub insert {
    my $pid = fork();
    if ($pid > 0) {
        return;
    }
    else {
        &insert_to_mysql();
        my $last_id = &get_last_inserted(); # call mysql last_inserted_id
        exit(0);
    }
}

for my $i (1..10) {
    &insert();
}

由于在多处理环境中调用了
insert
,因此
get\u last\u inserted
的顺序可能不确定。它是否总是返回与
insert\u to\u mysql
子例程相对应的正确的最后一个id?我读过一些文档,其中说只要进程不共享同一个mysql连接,返回的id将始终是正确的。但是,这些进程是从同一个会话派生的,所以我不确定它们是否共享mysql连接。提前感谢。

我不知道MySql和perl,但在PHP中这是完全相同的问题,因为它取决于环境而不是语言。在PHP中,最后一个插入id需要一个参数:current connection!只要多个实例不共享同一个连接资源,将连接资源传递给当前mysql会话就可以了

这就是我在谷歌上发现的:

这些进程是从同一个会话派生的

你是说你在多个进程中使用同一个连接?这根本不起作用,更不用说上次插入ID()。不能有两个进程从同一个连接读取和写入数据!假设两个客户机没有对彼此的请求进行重击,那么一个客户机的响应可能会在另一个客户机中结束


在多处理环境中,last_insert_id是否返回正确的自动增量id

根据MySQL的
LAST\u INSERT\u ID()

生成的ID在服务器中按每个连接进行维护


否则就没用了。因为连接不能跨进程共享,所以是安全的。

谢谢,
连接不能跨进程共享
解决了我所有的问题。