防止在play2.1应用程序上同时进行DB事务

时间:2013-06-05 16:25:28

标签: java mysql playframework-2.0 ebean

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

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

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

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

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

是否有一种通过使用锁或其他东西来绕过这种行为的好方法? 我在基于java的play 2.1.0上使用默认的Ebean ORM和MySQL db。

2 个答案:

答案 0 :(得分:1)

我不知道这是否回答了你的问题,但是here is a link回到了Ebean交易页面。

答案 1 :(得分:1)

这根本不是Play游戏。我的建议是不要使用锁。如果这样做,则会限制应用程序的可伸缩性。

你需要应对这种竞争条件。竞争条件将永远发生,你无法阻止它们。所以,拥抱它们。

在实例中,您描述了声音,如果数据库中存在挂起状态,则活动状态应该覆盖挂起状态。