我总是检查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...
}但今天我在想,如果这是一件正确的事情,也许甚至已经有一个函数可以重试,而不是在代码中键入两次相同的查询(因此,如果我们更改一个,我们必须记住更改另一个)。
我的问题是
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)
发布于 2015-05-28 23:28:32
很明显,你在这里追求的策略是“被设计打破”。你没有弄清楚为什么以前的尝试没有成功,而是(盲目地.)“只是再试一次。”(显然,在你的“开发环境”的象牙塔里,它还没有(!)“失败了两次!”但是,它迟早会的。)
您需要“一劳永逸地到达底部”。
为什么(?!)查询第一次尝试失败了吗?有什么合理的理由让它这么做吗?(我没有看到.)因此,这是不够的--“仅仅使问题(似乎)消失”是不够的。你必须解决这个问题。
当您在SQL中“更新”时,在共享数据库中,通常需要使用“事务”。(而且,在MySQL环境中,这意味着您必须使用"InnoDB“表。)您可以进行BEGIN TRANSACTION,然后进行一系列更新(或插入、删除、任何.),然后是COMMIT或ROLLBACK。
发布于 2015-05-28 23:32:40
发布于 2015-05-28 23:40:42
引用php的话:
使用UPDATE时,MySQL将不会更新新值与旧值相同的列。这就产生了这样一种可能性,即mysql_affected_rows()可能实际上并不等于匹配的行数,而只是实际受查询影响的行数。
https://stackoverflow.com/questions/30518605
复制相似问题