【问题标题】:How to avoid db lock如何避免数据库锁
【发布时间】:2015-01-07 05:41:47
【问题描述】:

我正在开发游戏的后端。玩家首先购买他们的门票,这些门票存储在数据库中,然后他们开始游戏并赢得某些奖品。每个玩家最多可以购买 60 张门票。

出现了一个新要求,为每场比赛的门票总数设定了上限 - 10 000 张门票。该实施将涉及向购买端点添加一个测试,检查当时购买的门票总数+当前购买所需的门票数量小于或等于该游戏的最大门票数量,以便购买被接受。

问题是,通过在tickets表上使用count计算当前已购买门票的数量,返回的值可能是过时的,因为此时其他玩家可能已经购买了门票。

一种可能的解决方案是在购买期间锁定门票表,但这会对性能和用户体验产生负面影响。如果您有不同的想法,请告诉我。

【问题讨论】:

  • 您是否考虑过使用Semaphore,而不是在数据库级别锁定?
  • 如果你有身份并且你从不删除身份,而不是做一个计数,你可以 max 和 min 然后简单地相互扣除以立即得到计数。

标签: java concurrency locking db2 dirtyread


【解决方案1】:

如果您的限制是硬性限制,那么您必须避免同时进行多项购买。可能在数据库中适当的表锁是完成这种序列化的最佳方式。可能还有其他替代方案(即在前端某处执行序列化),但它们可能实现起来更麻烦、更容易出现错误并且性能更差。

事实上,如果没有适当的数据库锁定,可能很难让您的游戏表现出一致的行为。另一方面,您可能不需要显式 锁定。如果您使用适当的事务隔离级别配置数据库,那么它应该为您执行所有必要的锁定。

由于这里没有明显的胜利,我建议您搁置性能问题,直到您可以实际测试您的性能。如果结果不够好,那么您可以从实际测量中确定系统的哪些部分最能从调整中受益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2011-05-05
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多