last_insert_id是否在多处理环境中返回正确的auto_increment id?

时间:2013-05-15 04:03:03

标签: mysql perl multiprocessing

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

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();
}

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

2 个答案:

答案 0 :(得分:2)

  

这些过程是从同一会话产生的

您是说您在多个流程中分叉并使用相同的连接?这根本不起作用,不要介意LAST_INSERT_ID()。您不能从同一个连接读取和写入两个进程!假设两个客户没有破坏对方的请求,那么对一个人的反应最终可能会结束。


  

last_insert_id是否在多处理环境中返回正确的auto_increment id?

根据MySQL的LAST_INSERT_ID() {{1}},

  

生成的ID基于每个连接在服务器中维护。

否则它将毫无用处。由于连接不能跨进程共享,是的,它是安全的。

答案 1 :(得分:1)

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

这就是我发现的谷歌搜索:http://www.xinotes.org/notes/note/179/