执行两次查询,避免查询失败


Running Query twice in case of failure

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

有时对于重要的查询,我甚至将它们放在有限的While循环中,以便在失败的情况下尝试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...
}

但是今天我在想如果这是一个正确的事情,也许甚至已经有一个函数来重试,而不是在代码中输入两次相同的查询(所以如果我们改变一个,我们必须记住改变另一个)

My Questions Are

  1. 这是正确的事情吗?任何缺点吗?(我的意思是它不会运行两次,如果它是成功的)

  2. 是否有更简单的方法来做到这一点(不使用相同的代码两次)?我复制粘贴相同的查询两次,如果我改变第一个,忘记改变第二个它可能是危险的(我使用Meedo这是一个PDO包装器)

P.S. I know the second won't work if the MySQL is down etc, i do it for temporary Failed attempts or Aborts or anything else that may not happen on the second try)

显然,您在这里追求的是一种"被设计破坏"的策略。而不是找出为什么之前的尝试没有成功,你是(盲目地…)"再试一次。"(显然,在您的"开发环境"的象牙塔中,它还没有[!)]"两次失败 !"但是,迟早会的。)

你需要"一劳永逸地到达底部。"

为什么(?!)第一次查询失败?有什么合理的理由可以解释为什么会这样吗?(I see none…)因此,"仅仅使问题(看起来)"是不够好的。"走开。你必须解决这个问题。

当你在SQL中"更新东西"时,在共享数据库中,你通常需要使用"事务"。(而且,在MySQL环境中,这意味着你必须使用"InnoDB"表。)你的BEGIN TRANSACTION,然后你做你的一系列更新(或插入,删除,无论…),然后你要么COMMITROLLBACK

  1. 这不是正确的实现方式。查找错误,然后显示错误信息,并要求用户在几秒钟或几分钟后重试。

  2. 也许您正在查找Transactions

引用自php:

当使用UPDATE时,MySQL将不会更新新值所在的列等于原来的值。这就产生了一种可能性Mysql_affected_rows()实际上可能不等于行数方法所影响的行数查询。