使用Waterline JS的Atomic Update One

时间:2016-10-17 23:11:47

标签: sql node.js sails.js waterline

目标

我想根据搜索条件更新单个记录(类似于findOne,但我想更新一个)。这必须是原子的,因为.find() then .update()将利用节点的精彩异步性质,并在查找之后和更新之前保持记录打开以进行更改。

实施例

让我们说要简化我记录我的财产的事情,我想通过网站借给朋友。如果两个朋友同时想借用任何可用的书籍,我需要将其属性标记为正在使用以防止出现问题。

如果我使用Book.find(available==true)然后使用Book.update(book, available=false),则可能会出现竞争条件,其中线程运行.find()并且在等待从数据库回听时,调用.find()对于其他用户,两者都导致同一本书借出。这显然是一个问题,也是我想要防范的。

问题

如何防范这种情况?有没有办法使用水线的辅助方法更新一条记录?或者我是否需要执行本机SQL查询?

1 个答案:

答案 0 :(得分:0)

你可以使用mongodb native findAndModify():

 var ObjectId = require('mongodb').ObjectID;

 Book
  .native(function (err, collection) {
  collection.findAndModify(
    {_id: new ObjectId(Id), available: true},
    {$set:{ available: false}}, 
    { upsert: true }
    function (err, result) {
        // manage after update
    }
});