我今天的支付工作流程遇到了严重问题 付款完成后,会发生两件事:
当用户被重定向到成功页面时,我们会检查是否存在具有付款ID的付款。如果不是这种情况,我们会创建pending
付款,我们可以向他展示。
当付款服务提供商发送付款通知时,我们会检查是否存在带有付款ID的pending
付款并将其设置为active
,如果不存在付款,我们只需创建active
之一。
问题在于:两个事件都可以(并且确实!)同时发生,这样两个例程都找不到现有的付款,因此创建了两个付款。一个pending
和一个active
。
是否有一种通过使用锁或其他东西来绕过这种行为的好方法? 我在基于java的play 2.1.0上使用默认的Ebean ORM和MySQL db。
答案 0 :(得分:1)
我不知道这是否回答了你的问题,但是here is a link回到了Ebean交易页面。
答案 1 :(得分:1)
这根本不是Play游戏。我的建议是不要使用锁。如果这样做,则会限制应用程序的可伸缩性。
你需要应对这种竞争条件。竞争条件将永远发生,你无法阻止它们。所以,拥抱它们。
在实例中,您描述了声音,如果数据库中存在挂起状态,则活动状态应该覆盖挂起状态。