Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql分组插入?_Php_Mysql - Fatal编程技术网

Php mysql分组插入?

Php mysql分组插入?,php,mysql,Php,Mysql,假设我有一个网站,网站上有2个用户 两者都加载一个php页面,在mysql中插入1000个大行,并使用for循环加载它们 现在,插入正在交叉,例如,来自用户1的15个插入,然后来自用户2的3个,然后来自用户1的5个 如果用户1首先加载php文件,那么用户2必须等到用户1插入完所有1000行后,用户2才能开始执行操作。php没有用于在会话之间同步的内置机制 但是,您可以在数据库中引入虚拟文件或虚拟表,其中包含实际使用数据库的用户的信息。用户完成后,应删除此信息,这意味着数据库再次可用。使用MySQ

假设我有一个网站,网站上有2个用户

两者都加载一个php页面,在mysql中插入1000个大行,并使用for循环加载它们

现在,插入正在交叉,例如,来自用户1的15个插入,然后来自用户2的3个,然后来自用户1的5个


如果用户1首先加载php文件,那么用户2必须等到用户1插入完所有1000行后,用户2才能开始执行操作。php没有用于在会话之间同步的内置机制


但是,您可以在数据库中引入虚拟文件或虚拟表,其中包含实际使用数据库的用户的信息。用户完成后,应删除此信息,这意味着数据库再次可用。

使用MySQL insert delayed,以下是文档:


它将对插入查询进行排队,当一个查询完成时,另一个查询将开始。但是如果您想在发送第二个查询之前加入来自用户的所有查询,这将是一个更复杂的问题,也许内存中的临时表可以帮助您在实际进行插入之前保存用户会话表。但是我认为insert delayed可以解决您的问题。

不要使用虚拟表,而是使用memcache,每当用户尝试访问数据库时,在授予访问权限之前,每次检查memcache变量时,都在memcache中设置一个变量。它可以采用与操作系统中使用符号机相同的概念来实现,以锁定处理器。

我不知道要保存的数据类型,以及为什么需要让用户2等待用户1完成插入,也不知道需要哪种可用性。 但是,我将把问题从PHP脚本转移到DB

如果您不需要立即访问插入的数据,我会走这条路。 我会考虑使用一个中间表,从用户1和用户2插入所有插入,而不考虑数据的唯一性。 然后,在MySQL中,我将编写一个存储过程,从一个定时事件中定期调用,它从这个中间表中获取所有记录并存储在正确的表中,删除重复项。这取决于您的设计,可能只需要使用一个SELECT DISTINCT或GROUP BY

这种方法将并发问题从PHP转移到数据库。它使PHP脚本非常简单且可伸缩:不需要跟踪可能复杂的并发机制,如果明天您将有三个或更多并发脚本而不是两个,只需添加它,所有脚本都仍然可以工作。 从用户的角度来看,执行过程中没有任何延迟

唯一的缺点是,插入后无法立即获得所有数据,因为必须等待DB事件运行。但是,如果小心地编写存储过程,甚至可以每10或5分钟调用一次

相反,如果在插入时需要几乎实时地访问插入的数据,则可以使用触发器而不是定时事件来部分修改此方法。
我仍将保留一个中间表作为缓冲,在其中放置所有数据,然后在更新后使用触发器检查刚刚插入的记录是否已存在于目标表中,并且仅在不存在时才将其放置在目标表中

你试过桌子锁吗不过,如果执行时间足够长,user2的脚本可能会超时。。。如果有很多用户,几乎可以肯定,队列后面的那些用户将超时。您如何插入行?您正在创建一个具有多个值的INSERT语句吗?还是要分别插入每一行?我正在调查。谢谢