我总是检查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...
}
但今天我在想这是否是正确的事情,甚至可能已经有一个重试的功能,而不是在代码中输入两次相同的查询(所以如果我们改变一个我们必须记住改变其它)
这是正确的做法吗?任何缺点? (我的意思是,如果成功,它不会运行两次)
有没有更简单的方法(两次不使用相同的代码)?我复制 - 粘贴相同的查询两次,如果我更改第一个而忘记更改第二个则可能很危险(我使用的是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)
答案 0 :(得分:4)
显然,你正在追求一种“按设计破坏”的策略。而不是弄清楚为什么之前的尝试没有成功,你是(盲目......)“再试一次。” (而且,显然,在你的“开发环境”的象牙塔中,它还没有 [尚(!)] “两次失败”但是,更快或更早,它会。)
你需要“一劳永逸地”到达底部。
为什么(?!)是第一次尝试失败的查询?应该有什么合理的理由吗? (我看不到......)因此,“只是让问题(似乎)”消失是不够的。'“你必须解决它
当您在SQL中“更新内容”时,在共享数据库中,您通常需要使用“事务”。 (并且,在MySQL环境中,这意味着您必须使用“InnoDB”表。)您BEGIN TRANSACTION
,然后您进行一系列更新(或插入,删除,等等.. 。),然后你COMMIT
或ROLLBACK
。
答案 1 :(得分:1)
这是不正确的实施方式。只需查找错误,然后显示错误消息并要求用户在几秒钟/几分钟内重新尝试。
也许您正在寻找Transactions
答案 2 :(得分:1)
来自php的报价:
使用UPDATE时,MySQL不会更新新值的列 与旧值相同。这创造了这样的可能性 mysql_affected_rows()实际上可能不等于行数 匹配,只有受字面意义影响的行数 查询。