我有以下问题:我有一个java服务,它总结或减去存储在我的mongodb数据库中的值。
例如,如果数据库中的值为100,并且使用值10调用我的服务,则会发生以下情况:
但是,我害怕并发。如果很多人打电话给同一个服务会怎么样?在这个过程的最后我害怕价值不一致。
问题是:上面描述的这个过程是线程安全的吗? (我相信不是)。我该怎么做才能保持我的数据一致并处理这个线程并发?
更新
下面是代码
public void update(Size entity, Integer newValue) {
Size size = repository.findOneById(entity.getId());
size.setTotal(size.getTotal() + newValue);
repository.update(size);
}
答案 0 :(得分:2)
不,它不是线程安全的,因为它不是原子地完成的,因为MongoDB
不是事务数据库,你应该使用{{ 1}}运算符可以满足这种需求,因为它允许增加给定数量的给定字段的原子,更多详细信息here。