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の1つの行を手動で変更is_done=1し、その行に設定した場合でも、スクリプトはその行を処理します。スクリプトを調整して、mysqlから新しく更新された行を読み取り、その間に完了としてマークされた行をスキップするにはどうすればよいですか?

4

2 に答える 2

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 に答える
0

なぜ簡単なことを入れないのですか。睡眠を使う目的は何ですか?

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

テーブル全体にクエリがなく、1つずつ変更します。

スリープを使用する必要がある場合は、これを試してください:

mysql_query("UPDATE my_table SET is_done=1 WHERE is_done=0 and id='$id'");
于 2013-02-26T11:00:02.850 に答える