Spring数据-MongoDb-如果我更新同一文档两次,会发生什么

问题描述 投票:0回答:1

我正在将SpringBoot 2.1.10和SpringData与MongoDB 3.6.2一起使用

我有一个@Service类,具有以下用于保留通用凭单凭证的业务逻辑:

public Voucher reserveVoucher() {
     Voucher voucherToReserve = voucherRepository.findFirstByStatusEquals(VoucherStatus.ACTIVE)
        .orElseThrow(() -> new BadRequestException("VOUCHER_NOT_FOUND", "Voucher with status ACTIVE not found"));

     voucherToBeConsume.setStatus(VoucherStatus.RESERVED);
     voucherToBeConsume.setUserId(voucherConsumer.getUserId());

     return voucherRepository.save(voucherToBeConsume);
}

我知道Spring中的@Service类默认为Singleton。如果findFirstByStatusEquals方法检索相同的文档并且在save方法执行两次之后,在服务器数量更多的环境中会发生什么情况?文档已更新两次或第二次更新失败?

java spring mongodb spring-boot spring-data-mongodb
1个回答
0
投票

在MongoDB中,您不能在事务数据库中使用像SELECT ... FOR UPDATE这样的行锁。因此,根据您的情况,该文档可能会更新两次。

但是您可以通过条件更新来模拟它:

UpdateResult updateResult = mongoTemplate.updateFirst(
  query(
    where("_id").is(voucherToReserve.getId())
     .and("status").is(VoucherStatus.ACTIVE)
  ), 
  new Update()
    .set("status", VoucherStatus.RESERVED)
    .set("userId", userId),
  Voucher.class
);  
if(updateResult.getModifiedCount() != 1){
  throw ...
}

另请参阅https://www.mongodb.com/blog/post/how-to-select--for-update-inside-mongodb-transactions

© www.soinside.com 2019 - 2024. All rights reserved.