1

我今天在我们的付款工作流程中遇到了一个严重的问题。
付款完成后,会发生两件事:

  • 用户被重定向到我们服务器上的成功页面,重定向还附加了支付 ID
  • 支付提供商向我们的服务器发送包含支付 ID 的支付通知

当用户被重定向到成功页面时,我们检查是否存在具有支付 ID 的支付。如果不是这种情况pending,我们会创建一个可以显示给他的付款。

当支付提供商发送支付通知时,我们检查是否存在pending带有支付 id 的支付并将其设置为active,如果不存在支付,我们只需创建active一个。

这就是问题所在:这两个事件可以(并且确实!)同时发生,这样两个例程都没有找到现有的付款,因此创建了两个付款。一个pending和一个active

有没有一种很好的方法可以通过使用锁或其他东西来规避这种行为?我在带有 MySQL 数据库的基于 java 的 play 2.1.0 上使用默认的 Ebean ORM。

4

2 回答 2

1

我不知道这是否回答了您的问题,但这里是Ebean 交易页面的链接。

于 2013-06-05T22:45:30.910 回答
1

这根本不是 Play 的事情。我的建议是不要使用锁。如果这样做,您将限制应用程序的可伸缩性。

您需要应对这种竞争状况。竞争条件总是会发生,您无法阻止它们。所以,拥抱他们。

在您描述的实例中,如果两者都存在于数据库中,则挂起状态应该被活动状态覆盖。

于 2013-06-06T05:22:32.397 回答