我总是检查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
这是正确的事情吗?任何缺点吗?(我的意思是它不会运行两次,如果它是成功的)
是否有更简单的方法来做到这一点(不使用相同的代码两次)?我复制粘贴相同的查询两次,如果我改变第一个,忘记改变第二个它可能是危险的(我使用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
,然后你做你的一系列更新(或插入,删除,无论…),然后你要么COMMIT
或ROLLBACK
。
-
这不是正确的实现方式。查找错误,然后显示错误信息,并要求用户在几秒钟或几分钟后重试。
-
也许您正在查找Transactions
引用自php:
当使用UPDATE时,MySQL将不会更新新值所在的列等于原来的值。这就产生了一种可能性Mysql_affected_rows()实际上可能不等于行数方法所影响的行数查询。