2

次のようなデータベースがあります。

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

ユーザーが投票するたびに

increment($inc) score by +1

次に、timeScore を次のように更新します。 (86400 / nowTimestamp() - time + 1 ) 次に、totalScore を次のように更新します。(timeScore + score)

例: 2 回目の更新後の最終値:

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

問題は、私の外部計算中に、別のユーザーがスコアに+1を追加して合計を計算し、データを更新する前にその値を書き込んでデータが破損する可能性があることです。

これを解決するにはどうすればよいですか、またはスレッドセーフにするにはどうすればよいですか?

4

2 に答える 2

8

mongodbfindAndModify関数を使用できるはずです。これにより、アトミックな更新を行うことができます。つまり、ドキュメントが変更されている間は、別のクエリで値を更新することはできません。ここで利用可能なドキュメント。

また、データをストレージにプッシュする前に、読み取りと書き込みの必要がなくなるので、できるだけ多くの計算を行うことを検討することをお勧めします。

于 2012-11-25T22:21:59.193 に答える