Webapp java同步对象获取



我有一个情况在我的java,基于spring的web应用程序。我的服务器生成优惠券(一个数字与字母混合,所有随机但唯一),每个优惠券可以应用或使用,只有一个,只有登录的客户。它们在前端显示给所有用户,然后由客户接受/选择。但是一旦被一个客户接受,它就被分配给他,而不能给其他人使用。

我试图做同步代码块检查优惠券是否已经应用/可用,它工作,但是,当两个用户在同一时间点击它的情况下,它失败了(得到分配给两个)

请帮。

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

  • 用户尝试优惠券,获得ID
  • 启动DB事务,从中获取优惠券行,并锁定它
  • 做你需要做的,然后使优惠券无效
  • 结束DB事务,释放锁

数据库不一定需要是一个独立的RDMS,在简单的情况下,甚至SQLite都足够了。无论如何,db处理竞争条件肯定比您(或我们大多数人)做得更好。

如果您希望避免数据库事务,您可以使用包含所有生成的优惠券的Set和仅引用可用优惠券的Set。当用户在同步块中选择优惠券时,从可用的优惠券中删除该优惠券。第二个用户无法获得它

最新更新