防止来自2个crons作业的重复行

时间:2016-12-28 10:59:58

标签: php mysql database cron

我有一个插入数据库的脚本,同时从2个cron作业调用脚本,所以在很多情况下我可以同时拥有相同的数据(小时,分钟,秒)。 实际上我对cron作业没有控制权,但我在脚本上有它。 那么是否有任何方法可以防止重复行?

代码:

function checkDuplicate($email) {
    $return = 0;
    if($email != "" ){
        $sql = "SELECT d.id_data as nbre FROM data d WHERE  d.email = '" . $email . "' ";
        $nbreEmails = $db->run($sql);
        $return = (sizeof($nbreEmails) > 0) ? 1 : 0;
    }
    return $return;
}

if(!checkDuplicate($email)){
    $insert = array(
       "id_client" => $id_client,
       "email" => $email,
       "valide" => 1,
       "stat" => "valide",
       "date_insert" => date("Y-m-d H:i:s"),
       "date_refus" => null
    );

    $db->insert("data", $insert);
}

感谢。

1 个答案:

答案 0 :(得分:0)

您应该将时间戳字段设置为唯一。

如果你不能设置它,或者有更复杂的条件应该确认脚本1& script2永远不会在同一时间插入(或与此表有关),你应该使用锁表,即:

// not sure waht do you use as $db
$db->execute('LOCK TABLES data WRITE;');
...// inserts
$db->execute('UNLOCK TABLES;');

或使用交易(MySQL

建议您使用PDO(PDO::beginTransaction

或者使用您使用的框架名称更新您的帖子,其中大多数应该有办法实现。