我今天在我们的付款工作流程中遇到了一个严重的问题。
付款完成后,会发生两件事:
- 用户被重定向到我们服务器上的成功页面,重定向还附加了支付 ID
- 支付提供商向我们的服务器发送包含支付 ID 的支付通知
当用户被重定向到成功页面时,我们检查是否存在具有支付 ID 的支付。如果不是这种情况pending
,我们会创建一个可以显示给他的付款。
当支付提供商发送支付通知时,我们检查是否存在pending
带有支付 id 的支付并将其设置为active
,如果不存在支付,我们只需创建active
一个。
这就是问题所在:这两个事件可以(并且确实!)同时发生,这样两个例程都没有找到现有的付款,因此创建了两个付款。一个pending
和一个active
。
有没有一种很好的方法可以通过使用锁或其他东西来规避这种行为?我在带有 MySQL 数据库的基于 java 的 play 2.1.0 上使用默认的 Ebean ORM。