我正在使用php mysql函数更新旧脚本以使用mysqli,我已经发现了一个有趣的问题(mysqli_use_result() and concurrency),但它没有澄清一件事:
假设五个用户连接到一个网页,他们同时连接,user1是第一个从庞大的MyIsam数据库中选择数据的人(15000个论坛帖子记录,左边连接到'用户'和'附件'表)
当php脚本检索结果时,其他用户将无法获得结果,是吗?
同样使用上面相同的情况,当user1完全收到它的结果时,会发送'UPDATE set view_count = INC(1)'查询并且我想这个表是锁定的,并且同样的查询对其他用户来说会失败?
答案 0 :(得分:2)
关于您引用的文章。这只是意味着你不应该这样做:
mysqli_query($link, $query);
mysqli_use_result($link);
// lots of 'client processing'
// table is blocked for updates during this
sleep(10)
mysqli_fetch_* .....
在这种情况下,建议您这样做:
mysqli_query($link, $query);
mysqli_store_result($link);
// lots of 'client processing'
// table is NOT blocked for updates during this
sleep(10)
mysqli_fetch_* .....
文章进一步说,如果发出第二个查询 - 在调用mysql_use_result()之后,在从查询中获取结果之前,它将失败。这意味着每个连接 - 每个脚本。因此,其他用户的查询在此期间不会失败。
当php脚本检索结果时,其他用户将无法获得结果,是吗?
不,这不对。 MySQL支持与my.ini
max_connections
中配置的并行连接数一样多的并行连接。并发读取由mysql服务器处理。除非达到最大连接限制且mysqli_connect()失败,否则客户端代码不必担心。如果你的应用程序经常发生这种情况,你将在大多数情况下首先尝试调整你的mysql配置,以便mysql允许更多的并行连接。如果达到阈值,您将使用类似复制或mysql集群的尝试。
同样使用上面相同的情况,当user1完全收到它的结果时,会发送'UPDATE set view_count = INC(1)'查询并且我想这个表是锁定的,并且同样的查询对其他用户来说会失败?
当存在并发读写时,这当然是性能问题。但是MySQL服务器会为你处理这个问题,这意味着只要连接到mysql工作,客户端代码就不用担心了。如果你有很高的负载,你将主要使用主从复制或MySQL集群。
答案 1 :(得分:0)
这个查询对其他用户来说会失败吗?
数据库服务器通常比纯文本文件更智能 因此,您的查询不会失败。他们会等待。
虽然我根本不会使用mysqli_use_result()。 为什么不直接获取你的结果?