0

当从 PayPal 收到所谓的 IPN 消息时,我需要更新数据库中的一行。

问题是我需要完美的可靠性。

目前我使用 InnoDB。我担心交易可能会由于竞争条件而失败。

我应该使用LOCK TABLES吗?还有其他可靠的解决方案吗?

我应该检查失败并重复交易几次(多少次?)?

4

1 回答 1

1

无论顺序如何,您都无法可靠地使分布式进程(例如在本地添加一行并远程通知服务器)完全可靠。这很像两个将军的问题:没有一个事件可以同时表示双方成功完成交易,因为任何消息都可能在此过程中丢失。

我不确定我是否正确理解了您的问题,但也许以下方法会起作用:在某个表中写一行,指出您要验证给定消息的事实。然后进行验证,然后在数据库中写入关于验证结果的行。在不太可能但重要的情况下,中间发生了一些事情,您将有一个没有匹配结果行的意图行。然后,您可以检测此类情况并手动从中恢复。

在您的本地数据库上,您将拥有单行更新,您可以在他们自己的事务中执行这些更新,甚至可能在打开自动提交的情况下。在开始与 PayPal 服务器通信之前,您必须确保第一次写入实际上已提交到磁盘(最好是其他磁盘上的二进制日志),但我认为不需要锁定或类似的。您可能想重试失败的事务,我会说最多 3 次,但重要的是最终您可以让管理员干预来修复您的代码无法处理的任何事情。

于 2012-10-07T18:35:44.027 回答