Spring数据mongodb并发get和update是线程安全的吗?

时间:2016-10-07 12:53:02

标签: java spring multithreading mongodb concurrency

我有以下问题:我有一个java服务,它总结或减去存储在我的mongodb数据库中的值。

例如,如果数据库中的值为100,并且使用值10调用我的服务,则会发生以下情况:

  • 我从数据库中获得值100
  • 我用值10
  • 加100
  • 我再次在数据库中保存新值(110)

但是,我害怕并发。如果很多人打电话给同一个服务会怎么样?在这个过程的最后我害怕价值不一致。

问题是:上面描述的这个过程是线程安全的吗? (我相信不是)。我该怎么做才能保持我的数据一致并处理这个线程并发?

更新

下面是代码

public void update(Size entity, Integer newValue) {
    Size size = repository.findOneById(entity.getId());
    size.setTotal(size.getTotal() + newValue);
    repository.update(size);
}

1 个答案:

答案 0 :(得分:2)

不,它不是线程安全的,因为它不是原子地完成的,因为MongoDB 不是事务数据库,你应该使用{{ 1}}运算符可以满足这种需求,因为它允许增加给定数量的给定字段的原子,更多详细信息here