2

我有一个数据库如下:

score:0
timeScore:86400
totalScore:0
time:1234567777  // Any time stamp

现在每次用户投票

increment($inc) score by +1

然后我将 timeScore 更新为 eg (86400 / nowTimestamp() - time + 1 ) 然后我将 totalScore 更新为(timeScore + score)

例如:对于第二次更新后的最终值:

score:1
timeScore:86400
totalScore:86401
time:1234567777 

问题是,在我的外部计算过程中,可能是另一个用户在分数上加了 +1 并计算了总数并在我更新数据之前写入了它的值,因此会出现数据损坏。

现在我该如何解决这个问题或如何使其线程安全?

4

2 回答 2

8

您应该能够使用 mongodbfindAndModify函数,它允许您进行原子更新,这意味着当您的文档被更改时,值不能被另一个查询更新。此处提供的文档。

您可能还希望在将数据推送到存储之前进行尽可能多的计算,因为这将消除读取然后写入的需要。

于 2012-11-25T22:21:59.193 回答
0

一种好方法是使用 OptimisticConcurrency 保存。使用可以实现线程安全的每个集合创建一个版本。

于 2020-06-04T06:40:17.990 回答