1

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

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

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

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

4

2 回答 2

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 集群。

于 2013-03-07T13:49:37.973 回答
0

对于其他用户,同样的查询会失败吗?

数据库服务器通常比纯文本文件更智能。
因此,您的查询不会失败。他们会等待。

虽然我根本不会使用 mysqli_use_result() 。为什么不直接获取你的结果呢?

于 2013-03-07T13:57:03.783 回答