mysqli_use_result()

时间:2013-03-07 13:47:12

标签: php mysql mysqli

我正在使用php mysql函数更新旧脚本以使用mysqli,我已经发现了一个有趣的问题(mysqli_use_result() and concurrency),但它没有澄清一件事:

假设五个用户连接到一个网页,他们同时连接,user1是第一个从庞大的MyIsam数据库中选择数据的人(15000个论坛帖子记录,左边连接到'用户'和'附件'表)

当php脚本检索结果时,其他用户将无法获得结果,是吗?

同样使用上面相同的情况,当user1完全收到它的结果时,会发送'UPDATE set view_count = INC(1)'查询并且我想这个表是锁定的,并且同样的查询对其他用户来说会失败?

2 个答案:

答案 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()。 为什么不直接获取你的结果?