以下是我的网络应用程序中的一些简化代码:
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连接。提前谢谢。
答案 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/