次のような問題があります。私のmongodbデータベースに保存されている値を合計または減算するJavaサービスがあります。
たとえば、データベースに値100があり、サービスが値10で呼び出されると、次のようになります。
- データベースから値100を取得します
- 100と値10を合計します
- データベースに新しい値(110)をもう一度保存します
しかし、私は「並行性を恐れています。多くの人が同じサービスを呼び出すとどうなりますか?」プロセスの最後で矛盾する価値を恐れています。
質問は:上記のこのプロセスはスレッドセーフですか? (そうではないと思います)。データの一貫性を保ち、このスレッドの並行性を処理するためにはどうすればいいですか。
更新
以下はコードに従います
public void update(Size entity, Integer newValue) {
Size size = repository.findOneById(entity.getId());
size.setTotal(size.getTotal() + newValue);
repository.update(size);
}
回答:
回答№1は2いいえ、 スレッドセーフではありません それは原子的に行われていないので MongoDB
は トランザクションデータベースではない、あなたが使用することになっています $inc
それが増加することを可能にするのでそのような必要性のためのオペレータ 原子的に 与えられた金額の与えられたフィールド、詳細 ここに.