调用findOne和doc.save()后文档是否被锁定

时间:2015-05-19 21:03:59

标签: node.js mongodb mongoose

我正在开发一个使用节点的应用程序 - > 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查询时的文档,并拒绝对其进行任何更新,直到我完成使用该文档?

1 个答案:

答案 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();
});