使用 bookshelf.js,如何自动更新模型记录?

With bookshelf.js, how do I update a model record atomically?

我与 JOB 模型和许多 TASK 之间存在一对多关系。我有一个用于单个任务的路由,我在其中获取用于显示的 TASK 模型,以及来自其 JOB 模型的一些数据。当我请求一个 TASK 时,我需要更新 locked 和 user_id 字段,这样我就可以锁定任务并显示谁锁定了它,这样其他用户就无法访问该任务视图。因此,我需要保证任务已锁定=0,并立即用时间戳更新该字段。

我当前的路由器代码是:

var route_task = function(req, res, next) {
   new Model.Task({id: req.params.id}).fetch(withRelated: ['jobs']})
      .then(function(task) {
         if (!task) {
            res.status(404);
            res.render('404_tpl');
            return;
         }
         if (task.get('locked') !== 0) {
            res.status(403);
            res.render('403_tpl', {title: '403 - Access Denied - Task is locked'});
            return;
         }
         else {
            /* I would update it here, but there's a slim */
            /* chance someone else can come in and select */
            /* the task. */
         }

         /* .. I set some res.locals vals from my task here .. */

         var jobs = task.related('jobs');
         jobs.fetch().then(function(job) {
            /* .. I set some res.local vals here from my jobs .. */

            switch (task.get('task_type')) {
               case 0:
                  res.render('task_alpha_tpl');
                  break;

               /* ... */
            }
         });
      })
}

当我为特定任务 ID 访问路由器时,我非常想 select * 其中 tasks.id = id 和 locked = 0,然后使用当前时间戳设置锁定,但是,我需要能够确定具有该 ID 的记录是否不存在,或者是否存在,但只是被锁定。

我希望这是有道理的。我来自 C 和 PHP 世界,所以我正在慢慢学习异步编程。

我认为你应该在交易中这样做我想如果你不想改变价值,我认为你不应该在客户端使用信号量或其他东西来模拟关键部分或其中的东西心态。

此问题的通用解决方案是运行以下形式的内容:

UPDATE task SET locked=1,user=? WHERE job=? AND locked=0

然后检查更新是否实际修改了至少一行。 如果你在 node.js 中这样做,那么我会做类似的事情:

Tasks.forge().where({job: req.param('code'), locked:0}).save({locked:1},{method:"update"});