2015-10-14 42 views
0

我在我的java,基于spring的web应用程序中有一种情况。我的服务器生成优惠券(一个混合了字母的数字,全部是随机但唯一的),每个优惠券只能由一个且仅在登录的客户上应用或使用。它们被显示在所有用户的前端,然后被客户接受/选择。但是一旦被一个客户接受,它就被分配给他并且不被其他人使用。Webapp java同步对象获得者

我试图做的代码块,检查是否已经应用了优惠券/ availed,它的工作,但案件就像当两个用户点击确切同时利用它的同步,它失败(被分配到两个)

请帮忙。

回答

1

请勿为此使用同步。您可以将优惠券的状态存储在数据库中,并使用锁定在数据库事务中处理这些数据。所以:

  • 用户试图优惠券,你得到的ID
  • 启动一个数据库事务,从中获得优惠券行,并锁定
  • 你需要,那么无效的优惠券什么
  • 完DB的事务,释放锁

数据库不necessarly需要一个独立的关系数据库管理系统,在一个简单的情况下,即使SQLite是足够的。无论如何,数据库肯定能够处理比你(或者我们大多数人)更能胜任的比赛条件。

0

如果您希望避免数据库事务,则可以使用带有所有生成的优惠券的集合和仅引用可用优惠券的集合。当用户在同步块中选择优惠券时,从可用优惠券中删除优惠券。第二个用户然后得不到它

0

只有当线程共享锁定时,同步才有意义;你没有描述你在这里锁定什么,所以很难说出什么是错误的。锁定在Web应用程序层通常是一个坏主意,因为不同实例中的线程不能共享同一个锁,因此您只能拥有一个Web应用程序实例;你失去了水平伸缩的能力。

您是否真的需要向所有用户展示相同的优惠券,然后让他们参与竞争?为每个用户生成一套单独的优惠券看起来会更好,因此您可以减少某人选择其他人刚刚声称的优惠券的可能性。

在任何情况下,服务器API都需要提供一种方法来接受优惠券并自行处理锁定(可能通过数据库事务,使用锁更新)。您的Web应用程序应将用户的选择呈现给服务器,并让服务器决定是否分配优惠券,但没有好方法让Web应用程序执行锁定。

+0

我正在锁定“这个”,在控制器中,我知道这是不好的。那么这个想法就是向他们展示他们订阅的优惠券,许多用户会订阅同一组优惠券,很多时候只有一张优惠券可用于某个类别,所以无论谁看到并接受第一个胜利。 –