Php 在出现故障时运行查询两次

Php 在出现故障时运行查询两次,php,mysql,pdo,Php,Mysql,Pdo,我总是检查MySQL查询是否成功,如果不成功,则再次运行它们(而不是显示或记录错误等) 有时对于重要的查询,我甚至将它们放入一个有限的,而循环中,在失败的情况下尝试5-10次 例如: $update = $db->update("table", ["today" => $date]]); if ($update === FALSE OR $affected_rows < 1) { // Optional sleep(1);

我总是检查MySQL查询是否成功,如果不成功,则再次运行它们(而不是显示或记录错误等)

有时对于重要的查询,我甚至将它们放入一个有限的
,而
循环中,在失败的情况下尝试5-10次

例如:

$update = $db->update("table", ["today" => $date]]);

if ($update === FALSE OR $affected_rows < 1)
{
    // Optional sleep(1);
    $update = $db->update("table", ["today" => $date]]);
}

if ($update === FALSE OR $affected_rows < 1)
{
    // Now log if the second try failed too...
}
$update=$db->update(“表”[“今天”=>$date]]);
如果($update===FALSE或受影响的$U行<1)
{
//选择性睡眠(1);
$update=$db->update(“表”[“今天”=>$date]]);
}
如果($update===FALSE或受影响的$U行<1)
{
//现在记录第二次尝试是否也失败。。。
}
但今天我在想,这是否是正确的做法,甚至可能已经有一个函数可以重试,而不是在代码中键入两次相同的查询(因此,如果我们更改一个查询,我们必须记住更改另一个)

我的问题是
  • 这样做对吗?有什么缺点吗?(我的意思是,如果成功,它不会运行两次)

  • 有没有更简单的方法来实现这一点(不使用相同的代码两次)?我将复制粘贴同一个查询两次,如果我更改第一个查询而忘记更改第二个查询,这可能会很危险(我使用的是Meedo,它是一个PDO包装器)


  • p.S.我知道如果MySQL宕机,第二次就不起作用了,等等,我这样做是为了暂时的失败尝试或中止,或者其他任何第二次尝试可能不会发生的事情)

    显然,你在追求一种“被设计破坏”的策略。你没有弄清楚前一次尝试没有成功的原因,而是(盲目地…)“只是再试一次。”(显然,在你的“开发环境”的象牙塔中,它还没有[还(!)]“失败两次!”但是,它迟早会失败的。)

    你需要“一劳永逸地了解这一点。”

    为什么(?!)查询在第一次尝试时失败了?有什么合理的理由吗?(我看不到任何…)因此,仅仅“让问题(看起来)消失”是不够的。你必须解决它


    在共享数据库中,当您在SQL中“更新内容”时,通常需要使用“事务”。(在MySQL环境中,这意味着您必须使用“InnoDB”表。)您
    开始事务
    ,然后进行一系列更新(或插入、删除,等等),然后你要么提交,要么回滚,显然,你在追求一种“被设计打破”的策略。你没有弄清楚之前的尝试为什么没有成功,而是(盲目地…)在“再尝试一次”。(显然,在你的“开发环境”的象牙塔中,它还没有[还(!)”失败了两次!“但迟早会的

    你需要“一劳永逸地了解这一点。”

    为什么(?!)查询在第一次尝试时失败了?有什么合理的理由吗?(我看不到任何…)因此,仅仅“让问题(看起来)消失”是不够的。你必须解决它

    在共享数据库中,当您在SQL中“更新内容”时,通常需要使用“事务”。(在MySQL环境中,这意味着您必须使用“InnoDB”表。)您
    开始事务
    ,然后进行一系列更新(或插入、删除,等等),然后您可以
    提交
    回滚

  • 这不是正确的实现方法。只需查找错误,然后显示错误消息,并要求用户在几秒钟/分钟后重试

  • 也许你在找

  • 这不是正确的实现方法。只需查找错误,然后显示错误消息,并要求用户在几秒钟/分钟后重试

  • 也许你在找

  • 引自php:

    使用UPDATE时,MySQL不会更新包含新值的列 与旧值相同。这会产生以下可能性: mysql_infected_rows()实际上可能不等于行数 匹配,仅受 询问

    引自php:

    使用UPDATE时,MySQL不会更新包含新值的列 与旧值相同。这会产生以下可能性: mysql_infected_rows()实际上可能不等于行数 匹配,仅受 询问


    现在我从来没有听说过“精神错乱是重复同样的错误,期待不同的结果”这就是你的所作所为。我将极为罕见的是,这种工作为什么要停在两点?对于这件事,考虑进入一个潜在的无休止的循环(我只是开玩笑)。有时,重试查询是有效的,但这当然取决于失败查询返回的错误。锁争用死锁会浮现在脑海中。除非您在群集上运行,否则通常不会出现问题。通常,任何事务回滚都是由另一个事务的活动引起的。但是语法错误、服务器问题,没有poin我从来没有听说过“精神错乱是重复同样的错误,期待不同的结果”这就是你的所作所为。我将极为罕见的是,这种工作为什么要停在两点?对于这件事,考虑进入一个潜在的无休止的循环(我只是开玩笑)。有时,重试查询是有效的,但这当然取决于失败查询返回的错误。锁争用死锁会浮现在脑海中。除非您在群集上运行,否则通常不会出现问题。通常,任何事务回滚都是由另一个事务的活动引起的。但是语法错误、服务器问题,没有poini don’’我不会再尝试了谢谢你,迈克,很遗憾我不能使用交易,但理性是不可能的,所以我想我必须问另一个问题,这是我带着这个(错误)想法来的主要原因谢谢你,迈克,很遗憾我不能使用交易,但理性是不可能的,所以我想我必须问另一个问题,不是吗