【发布时间】:2019-08-19 01:49:06
【问题描述】:
我为一个简单的游戏编写了一个 REST API,包括创建、加入和提交游戏的比赛。我在测试服务器时遇到了问题。通过单个玩家发送加入请求(一次有很多),服务器会多次将玩家加入大厅。
我的设计是这样的:
- 在玩家表中检查玩家的“正在玩”字段是否设置为 true,如果是则丢弃请求
- 如果玩家当前未在玩,则为大厅创建新玩家条目并将玩家的游戏状态设置为 true
我知道问题在于检查玩家是否正在玩。每个请求都由 Go 中的单独 goroutine 运行,因此每个 goroutine 从数据库中获取玩家“正在玩”字段等于 false 的信息可能会发生。然后每个 gouroutine 都会将相同的玩家添加到大厅乘以我想避免的次数。
有没有办法避免这个问题,或者问题出在我的设计中?
【问题讨论】:
-
这是一个标准的竞争条件。有很多方法可以解决。
标签: database postgresql