gpt4 book ai didi

java - Spring Data - MongoDb - 如果我更新同一文档两次会发生什么

转载 作者:行者123 更新时间:2023-12-02 08:43:51 25 4
gpt4 key购买 nike

我正在使用 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 方法检索相同的 Document 并且在 save 方法执行两次后会发生什么?文档更新两次还是第二次更新失败?

最佳答案

即使在一台服务器上,服务也可以同时被两个不同的线程调用,例如通过 2 个并发 REST 调用。

在 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

关于java - Spring Data - MongoDb - 如果我更新同一文档两次会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61212595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com