2013-02-26 78 views
0

我有一個表在MySQL類似如下─和mysql_fetch_row沒有返回新更新的行

​​

而且我有一個PHP腳本執行類似如下─

<?php 

$q=mysql_query("SELECT * FROM my_table WHERE is_done=0"); 

while($res=mysql_fetch_assoc($q)){ 
    $id=$res['id']; 
    //do something lengthy 
    sleep(60); 
    mysql_query("UPDATE my_table SET is_done=1 WHERE id='$id'"); 
} 

?> 

操作現在,如果我手動更改在mysql中一行,併爲該行設置is_done=1,該腳本仍處理該行。我如何調整我的腳本以從mysql讀取新的和更新的行並跳過同時標記爲完成的任何行?

+6

你在獲取已經捕獲的結果的同時。這就是爲什麼你沒有得到最新鮮的。要做到這一點,你必須再次獲取。 – fedorqui 2013-02-26 10:36:07

+0

您是否使用交易管理。什麼類型的my_table? – triclosan 2013-02-26 10:36:20

+0

如果你正在做一些真的很長的事情(我注意到你有一個「sleep(60)」 - 是一個現實的一分鐘),那麼你只需在數據庫的開始處查詢一行('LIMIT 1')循環的每次迭代。如果您實際上只是在談論幾分之一秒,那麼該行將不得不等待在處理該腳本之前對該腳本進行下一次調用,因爲您可能不希望快速連續多次重新查詢該數據庫。 – DaveRandom 2013-02-26 10:42:10

回答

0

爲什麼不把簡單的東西。使用睡眠的目的是什麼?

mysql_query("UPDATE my_table SET is_done=1 WHERE is_done=0"); 

您沒有在整個表中查詢並逐個更改。

,如果你需要使用睡眠那就試試這個:

mysql_query("UPDATE my_table SET is_done=1 WHERE is_done=0 and id='$id'"); 
0

如果你擔心調用不必要的SQL語句,我建議彙總的ID對循環(性能)外的陣列和更新:

<?php 
$q=mysql_query("SELECT * FROM my_table WHERE is_done=0"); 
$ids = array(); 
while($res=mysql_fetch_assoc($q)){ 
$ids[]=$res['id']; 
//do something lengthy 
sleep(60); 
} 
mysql_query("UPDATE my_table SET is_done=1 WHERE id IN ('".implode("','", $ids)."')"); 
?> 

對於已經包含新數據的行(沒有受影響的行,其中is_done = 1),MySQL不會執行任何操作。

如果您正在執行的操作您擔心可以使用Transaction來確保您正在執行的操作是Atomic,或者Table Locking以確保在腳本運行時不會發生更改。