如果发生故障,运行查询两次

时间:2015-05-28 23:17:04

标签: php mysql pdo

我总是检查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...
}

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

我的问题是

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

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

  3. 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)

3 个答案:

答案 0 :(得分:4)

显然,你正在追求一种“按设计破坏”的策略。而不是弄清楚为什么之前的尝试没有成功,你是(盲目......)“再试一次。” (而且,显然,在你的“开发环境”的象牙塔中,它还没有 [尚(!)] “两次失败但是,更快或更早,它会。)

你需要“一劳永逸地”到达底部

为什么(?!)是第一次尝试失败的查询?应该有什么合理的理由吗? (我看不到......)因此,“只是让问题(似乎)”消失是不够的。'“你必须解决

当您在SQL中“更新内容”时,在共享数据库中,您通常需要使用“事务”。 (并且,在MySQL环境中,这意味着您必须使用“InnoDB”表。)您BEGIN TRANSACTION,然后您进行一系列更新(或插入,删除,等等.. 。),然后你COMMITROLLBACK

答案 1 :(得分:1)

  1. 这是不正确的实施方式。只需查找错误,然后显示错误消息并要求用户在几秒钟/几分钟内重新尝试。

  2. 也许您正在寻找Transactions

答案 2 :(得分:1)

来自php的报价:

  

使用UPDATE时,MySQL不会更新新值的列   与旧值相同。这创造了这样的可能性   mysql_affected_rows()实际上可能不等于行数   匹配,只有受字面意义影响的行数   查询。