我有一个从MySQL数据库中选择一行的脚本。
然后更新此行。这样地:

$statement = $db->prepare("SELECT id, link from persons WHERE processing = 0");
$statement->execute();
$row = $statement->fetch();

$statement = $db->prepare("UPDATE persons SET processing = 1 WHERE id = :id");
$success = $statement->execute(array(':id' => $row['id']));

脚本同时多次调用此php代码。有时它选择行eventhough应该是“processing=1”,因为另一个脚本在准确的时间调用它。
我怎样才能避免这个?

最佳答案

您需要做的是在这里添加某种锁,以防止出现您创建的竞争条件:

UPDATE persons SET processing=1 WHERE id=:id AND processing=0

这样可以避免双重锁定。
要进一步改进此功能,请创建一个可用于声明的锁列:
UPDATE persons
  SET processing=:processing_uuid
  WHERE processing IS NULL
  LIMIT 1

这需要一个VARCHAR索引processing列,用于声明其默认值为NULL。如果在结果中修改了一行,则已声明了一条记录,可以使用以下方法处理该记录:
SELECT * FROM persons WHERE processing=:processing_uuid

每次尝试声明时,都会生成一个新的声明UUID密钥。

关于php - 选择并锁定一行,然后更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26996307/

10-12 06:27