1

场景:基于网络的文字游戏

  1. 玩家 A 向玩家 B 发送发送 10,000 积分的请求(此请求需要 20 毫秒才能完成)。
  2. 在发送第一个请求(仍在处理中)后 3 毫秒,玩家 A 向战斗玩家 C 发送另一个请求,此请求需要 100 毫秒才能完成。

发生了什么,在第 1 步中,应用程序从玩家 A 中删除积分,将其提供给玩家 B,但在将其保留在数据库中之前,第二个请求到来,加载状态仍显示玩家 A 帐户中的 10k 并覆盖请求中的正确状态1(0学分),10k +第2步的战利品。结果:玩家A和B现在都有10k在他们的账户中,钱只是翻了一番。

可以做些什么来防止这种情况发生?这是显示问题的假设场景,对于上述场景account=account+lootsql 会做,但我正在寻找适用于所有数据类型的解决方案。

4

1 回答 1

2

如果transaction isolation level将数据库上的 设置为可序列化,则可以将上述内容视为数据库级别的单个原子事件。

原子性是数据库系统的关键组成部分之一。

于 2012-10-10T19:46:08.130 回答