PHP下的mysql_query是一个阻塞函数吗?

时间:2010-04-16 12:02:06

标签: php mysql

假设我使用mysql_query在服务器上执行多个查询。每个查询的结果都会影响后续查询。在控制进入下一个调用之前,是否会完全执行mysql_query的所有调用?

编辑:我忘了提及,我没有使用交易存储引擎。

5 个答案:

答案 0 :(得分:6)

是的,MySQL服务器必须返回数据并在PHP进入下一个操作之前完成查询,无论是分配返回值还是进入下一行代码。

mysql_query( "INSERT INTO y VALUES (x,1)" );
mysql_query( "SELECT x FROM y WHERE z=1" );
mysql_query( "UPDATE y SET x=x+1 WHERE z=1" );
mysql_query( "SELECT x FROM y WHERE z=1" );

x将为1,然后是2,并且在第四个语句2的时间将返回到脚本。在单个PHP脚本中并行运行查询是不可能的 - 这需要并行执行或使用另一种语言(即Java)进行线程化。

答案 1 :(得分:2)

这不回答原始问题,但与问题标题有关:

如果你想要非阻塞,那么有一个准选项可行:

  1. 仅限INSERT
  2. 仅适用于MyISAM,MEMORY和ARCHIVE表
  3. 它在插入
  4. 上有一些开销/可能的性能损失

    这是在查询中使用INSERT DELAYED语法。然后,PHP将只等待mysql响应“OK”并且不会等待实际插入发生。

    http://dev.mysql.com/doc/refman/5.0/en/insert-delayed.html

答案 2 :(得分:1)

在同一个脚本和线程中,是的。来自其他PHP脚本的其他查询可能同时运行,但来自php脚本的所有查询都将阻止。

在继续之前,您将始终能够评估返回值。

答案 3 :(得分:1)

正如其他人已经提到的,PHP是一种顺序语言(即一个语句将在下一个语句之后执行),没有明确的线程支持。但你可以做的是使用mysql_unbuffered_query,它只会在返回结果的第一行之前阻塞(而不是像mysql_query那样等待所有行)。

答案 4 :(得分:0)

当您不使用事务时,无论您使用何种编程语言,MySQL都会立即提交每个查询。所以,是的,您可以依赖查询的顺序性。