2012-12-12 75 views
4

背景重试失败的MySQL查询?

我在PHP`(5.2)的贝宝IPN处理程序,处理事务和存储日期在MySQL数据库中。该网站的活动较少。

偶尔MySQL查询失败。 (很少)我记录了一切,如果PayPal消息未能得到处理,我可以查看我的日志文件并重新发送PayPal消息。

思想/关注

但我想知道如果我可以做的过程有点更强大,而不是有放弃之前的处理器重新尝试MySQL查询。

我可能想等一下 - 不要立即敲击多个查询尝试。

我希望能找到一些模式 - 寻找像“php mysql query retry”这样的东西,但没有太多的成功。

问题

  1. 是否有良好的实践指南为这个?

  2. 现有库?

  3. 是一个简单的循环和sleep之间每个查询尝试好,或可以有不良副作用?太原生了吗?

+1

为什么不在查询后检查错误,如果为真则重试?另一种方法只是将这个查询标记为“已撤消”,然后cron作业将使所有“未被采纳”的数据运行并每隔几分钟重新执行一次。 – stasgrin

+0

所以你说在失败的查询后立即重试? – thomthom

+0

至于cron作业 - 我会创建一种方法来恢复剩余事务的处理。这不仅仅是一个单一的查询 - 而是来自前一个数据的多个集合和一些回复。 – thomthom

回答

3

在php世界中良好的交易安全代码并不是常态,但如果您在java或.net代码示例中查找,有很多示例。

我见过的绝大多数好的数据库代码都将查询放入函数中,并在放弃和记录/排队之前立即重试约3次。希望这会照顾你的问题。

最佳做法是使用innodb表并将所有关键的sql语句放入提交或回滚的事务中。这样,即使某个特定的查询失败,您的数据仍处于一致的状态。 (注意,如果你不小心,这也可能会增加锁定问题)。

您不想在轮询时做长时间的睡眠,因为这可能会导致您的用户浏览器挂起。他们需要立即回复以确认购买是否已经完成。将作业放在队列中使用cron作业或服务器守护进程是另一种方式,但不会为用户提供即时反馈,并且可能为此目的而矫枉过正。

如果即时重试不起作用,您还有其他一些潜在的锁定问题,您需要锻炼的失败原因。

+0

对,这很有趣。我不确定实施重试是否是好的做法。在这种特殊情况下,我正在处理来自PayPal的消息,而不是人类最终用户。我会尝试实施一个重试系统,并仔细研究可能导致我的查询不时失败的原因。我自己不托管硬件,因此不能完全控制环境。这就是为什么我想尽可能使代码更健壮的原因。 – thomthom