【发布时间】:2023-03-12 09:15:01
【问题描述】:
场景:基于网络的文字游戏
- 玩家 A 向玩家 B 发送发送 10,000 积分的请求(此请求需要 20 毫秒才能完成)。
- 在发送第一个请求(仍在处理中)后 3 毫秒,玩家 A 向战斗玩家 C 发送另一个请求,此请求需要 100 毫秒才能完成。
发生了什么,在第 1 步中,应用程序从玩家 A 中删除了积分,将其提供给玩家 B,但在将其保留在数据库中之前,第二个请求来了,加载状态仍然显示玩家 A 的帐户中的 10k 并覆盖正确请求 1 中的状态(0 积分),第 2 步中的 10k + 战斗战利品。结果:玩家 A 和 B 现在的账户中都有 10k,钱只是翻了一番。
可以采取什么措施来防止这种情况发生?这是显示问题的假设场景,上述场景account=account+loot sql 可以,但我正在寻找适用于所有数据类型的解决方案。
【问题讨论】:
-
您可能只想查看锁(也称为互斥锁)、原子数据类型和事务。
-
这是一个非常非常好解决的问题。见Database locks。
-
那么不要让玩家做频繁的动作..即玩家不能在前一个动作之后的整整1秒内执行另一个动作。
标签: sql security web-applications