我在Kubernetes集群中部署了一个nodejs API服务器。 用户可以发送拍卖项目的出价。 为了防止出价超越另一个出价,需要进行一些同步。
我看到以下出价信息:
我不知道走哪条路。我也了解您需要使用IX或X锁定文档。
对于RDBMS,您将创建一个事务来锁定记录并在更新后将其释放,但是我不知道该记录对MongoDB的工作方式。
Product.findById(productId)
.then(productmatch => {
if (productmatch.currentPrice > price) throw Error('no go')
const bid = new Bid({
price,
date: Date.now(),
user: user._id
})
return Product.findByIdAndUpdate(productId, {
$push: {
bids: bid
},
currentPrice: price,
currentUser: user,
currentBid: bid
}, {
new: true
})
.then(product => {
if (!product) throw Error(`no go`)
return bid._id.toString()
})
})
答案 0 :(得分:0)
经过更多研究,我想出了这个解决方案,但是我不知道它是否100%可靠,但是我相信此方法将锁定文档,并且不允许其他线程在查询和更新操作之间读取文档。
var query = {
_id: productId,
closed: false,
currentPrice: {
$lt: price
}
},
update = {
$push: {
bids: bid
},
currentPrice: price,
currentUser: user,
currentBid: bid
},
options = {
new: true
};
return Product.findOneAndUpdate(query, update, options)
.then(product => {
if (!product) throw Error(`no product found with id ${productId}`)
return bid._id.toString()
})