Mysql 在多处理环境中,last_insert_id是否返回正确的自动增量id?
以下是我的web应用程序中的一些简化代码: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
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在服务器中按每个连接进行维护
否则就没用了。因为连接不能跨进程共享,所以是安全的。谢谢,
连接不能跨进程共享
解决了我所有的问题。