簡體   English   中英

PHP下的mysql_query是一個阻塞函數嗎?

[英]Is mysql_query under PHP a blocking function?

假設我使用mysql_query在服務器上執行多個查詢。 每個查詢的結果都會影響后續查詢。 在控制轉移到下一個調用之前,是否會完全執行mysql_query每次調用?

編輯:我忘了提,我沒有使用事務存儲引擎。

是的,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. 僅適用於INSERT
  2. 僅適用於MyISAM,MEMORY和ARCHIVE表
  3. 它在插入物上有一些開銷/可能的性能損失

這是在查詢中使用INSERT DELAYED語法。 然后,PHP將只等待mysql響應“OK”並且不會等待實際插入發生。

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

在同一個腳本和線程中,是的。 來自其他PHP腳本的其他查詢可能同時運行,但來自php腳本的所有查詢都將被阻止。

在繼續之前,您始終可以評估返回值。

正如其他人已經提到的,PHP是一種順序語言(即一個語句將在下一個語句之后執行),沒有明確的線程支持。 但是你可以做的是使用mysql_unbuffered_query ,它只會在返回結果的第一行之前阻塞(而不是像mysql_query那樣等待所有的行)。

當您不使用事務時,MySQL將立即提交每個查詢,無論您使用何種編程語言。 所以,是的,您可以依賴查詢的順序性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM