1

这是我的 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_last_inserted可能不确定。它是否总是返回与 insert_to_mysql子程序相对应的正确最后一个 id?我读了一些文件说只要进程不共享同一个mysql连接,返回的id总是正确的。但是,这些进程是从同一个会话中产生的,所以我不确定它们是否共享 mysql 连接。提前致谢。

4

2 回答 2

2

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

你是说你在多个进程中分叉并使用相同的连接吗?这根本行不通,没关系LAST_INSERT_ID()。您不能有两个进程从同一个连接读取和写入!假设两个客户端没有破坏对方的请求,那么一个响应可能会在另一个中结束。


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

根据 MySQL的文档LAST_INSERT_ID()

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

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

于 2013-05-15T05:44:49.317 回答
1

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

这就是我在谷歌上搜索的结果:http ://www.xinotes.org/notes/note/179/

于 2013-05-15T04:16:48.247 回答