複数の PHP スクリプトが並行して実行され、それぞれが同じテーブルの同じレコードに対して繰り返し UPDATE クエリを実行している場合、各クエリでテーブルが更新される前に「ラグ タイム」が発生する可能性はありますか?
基本的に、cron 経由で起動された PHP スクリプトのインスタンスが 5 ~ 6 個あり、並行して実行されています。各スクリプトは、テーブル内のすべてのレコードを取得し、items
それらをループして処理します。
ただし、同じアイテムを複数回処理することを避けるために、最後に処理されたアイテムの ID を別のテーブルに保存します。これが私のコードの仕組みです:
function getCurrentItem()
{
$sql = "SELECT currentItemId from settings";
$result = $this->db->query($sql);
return $result->get('currentItemId');
}
function setCurrentItem($id)
{
$sql = "UPDATE settings SET currentItemId='$id'";
$this->db->query($sql);
}
$currentItem = $this->getCurrentItem();
$sql = "SELECT * FROM items WHERE status='pending' AND id > $currentItem'";
$result = $this->db->query($sql);
$items = $result->getAll();
foreach ($items as $i)
{
//Check if $i has been processed by a different instance of the script, and if so,
//leave it untouched.
if ($this->getCurrentItem() > $i->id)
continue;
$this->setCurrentItem($i->id);
// Process the item here
}
しかし、あらゆる予防措置にもかかわらず、ほとんどのアイテムは複数回処理されています。これにより、PHP スクリプトによって更新クエリが実行されてから、データベースが実際にレコードを更新するまでの間に、多少のタイムラグがあると思います。
本当ですか?もしそうなら、currentItemId
複数のスクリプトが並行して実行されている場合でも、PHP スクリプトが常に最新のものだけを取得するようにするには、他にどのようなメカニズムを使用すればよいでしょうか? データベースヘルプの代わりにテキストファイルを使用しますか?