4

背景

我在 PHP`(5.2) 中有一个 PayPal IPN 处理程序,它处理事务并将日期存储在 MySQL 数据库中。该网站的活跃度很低。

有时 MySQL 查询会失败。(很少)我记录所有内容,如果无法处理 PayPal 消息,我可以查看我的日志文件并重新发送 PayPal 消息。

想法/担忧

但是我想知道我是否可以使该过程更加健壮,而是让处理程序在放弃之前重新尝试 mysql 查询。

我可能想稍等片刻——不要紧接着进行多次查询尝试。

我希望为此找到一些模式 - 搜索“php mysql query retry”之类的东西而没有取得太大成功。

问题

  1. 有没有好的实践指南?

  2. 现有的图书馆?

  3. 一个简单的循环和sleep每次查询尝试之间是否可以,或者会产生不希望的副作用?太土了?

4

1 回答 1

3

php 世界中良好的事务安全代码不是常态,但如果您查看 java 或 .net 代码示例,则有很多示例。

我见过的大多数优秀的数据库代码都将查询放在一个函数中,并在放弃和记录/排队之前立即重试大约 3 次。希望这会解决您的问题。

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

您不希望通过轮询长时间睡眠,因为这可能会挂起您的用户浏览器。他们需要立即回复以确认购买已通过。将作业与 cron 作业或服务器守护程序一起放入队列是另一种方法,但不会给用户立即反馈,并且为此目的可能是矫枉过正。

如果立即重试不起作用,则说明您遇到了其他类型的潜在锁定问题,以及您需要锻炼的失败原因。

于 2012-12-13T16:07:19.293 回答