0

我在mysql中有一个表,如下所示-

++++++++++++
+ my_table +
++++++++++++
id
is_done
++++++++++++

我有一个 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 读取新的和更新的行并跳过同时标记为已完成的任何行?

4

2 回答 2

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'");
于 2013-02-26T11:00:02.850 回答
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)."')");
?>

MySQL 不会对已经包含新数据的行执行任何操作(没有受影响的行,其中 is_done=1)。

如果您担心的是您正在执行的操作,您可以使用事务来确保您正在执行的操作是原子的,或者使用表锁定来确保在脚本运行时没有发生任何更改。

于 2013-02-26T11:25:58.263 回答