我正在开发一个使用节点的应用程序 - > express - > mongodb - > mongoose。
该应用有一个类似于拍卖的概念,其中有出价,大多数用户很可能会在拍卖的最后几秒尝试出价。
在接受用户出价之前,会有验证过程(日期,时间,出价大小,用户可用的帐户余额等),一旦完成,就会接受出价并保存拍卖文档。
问题是,用户是否可能在两者之间更新文档 findOne()调用,以及对结果文档进行的save()调用。
换句话说,
auction.findOne(_id: "something").exec(function(err, doc) {
if ( !err && doc ) {
//use the found document to do some validation that may or may not
//take some time.
//then document validates,
if ( document is valid ) {
doc.last_bid = "xxx";
//is it possible that someone makes an update to the document
//here that invalidates the document, and i will end up saving
//an invalid document
doc.save();
}
// else -> dont save anything and reject deferred promise.
//Is it possible that after ive done my validation and document validated successfully, that someone updates it, before i get to call save().
}
});
是否可以锁定"在制作findOne / find查询时的文档,并拒绝对其进行任何更新,直到我完成使用该文档?
答案 0 :(得分:0)
我认为你无法锁定一个猫鼬文件。我建议你一个解决方案,我认为你有一个经典的“排除”问题,因此,我将使用互斥量来尝试访问关键部分,在你的情况下,“关键部分”是udpate mongoose文档“doc.last_bid = 'XXX'”。试试“锁”: https://github.com/Wizcorp/locks
var rwlock = locks.createReadWriteLock();
rwlock.readLock(function () {
if(document is valid) {
doc.last_bid = 'xxx'
doc.set_is_not_valid_or_used = true; // invalidate document => if condition
}
rwlock.unlock();
});