如何避免db锁定

时间:2014-11-10 19:56:59

标签: java concurrency locking db2 dirtyread

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

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

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

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

1 个答案:

答案 0 :(得分:2)

如果您的约束很严格,那么您必须避免同时进行多次购买。 DB中适当的表锁可能是完成此类序列化的最佳方法。可能还有其他替代方案(即在前端的某个位置执行序列化),但它们实现起来可能更加混乱,更容易出错,而且性能更差。

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

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