背景
我在PHP`(5.2)中有一个PayPal IPN处理程序,它处理事务并在MySQL数据库中存储日期。该网站活动量较低。
偶尔MySQL查询失败。 (很少)我记录了所有内容,如果PayPal消息未能处理,我可以查看我的日志文件并重新发送PayPal消息。
想法/关注
但是我想知道我是否可以让这个过程更加健壮,而是让处理程序在放弃之前重新尝试mysql查询。
我可能想稍微等一下 - 不要紧接着追击多次查询尝试。
我希望找到一些模式 - 搜索“php mysql query retry”之类的内容,但没有取得多大成功。
问题
是否有良好的实践指南?
现有的图书馆?
是一个简单的循环,每个查询尝试之间的sleep
是否正常,或者是否会产生不良副作用?太原生了?
答案 0 :(得分:3)
PHP世界中良好的事务安全代码不是常态,但如果你查看java或.net代码示例,有很多例子。
我见过的最好的数据库代码将查询放在一个函数中,并在放弃和记录/排队之前立即重试约3次。希望这能解决你的问题。
最佳做法是使用innodb表并将所有关键sql语句放在已提交或回滚的事务中。这样,即使一个特定查询失败,您的数据也会处于一致状态。 (注意,如果你不小心,这也会加重锁定问题。)
您不希望通过轮询进行长时间睡眠,因为这可能会导致用户浏览器挂起。他们需要立即回复以确认购买已通过。将作业放在具有cron作业或服务器守护程序的队列中是另一种方法,但不会给用户提供即时反馈,并且可能因此而过度。
如果立即重试不起作用,你会遇到其他类型的潜在锁定问题,这是你需要锻炼失败的原因。