【问题标题】:With bookshelf.js, how do I update a model record atomically?使用 bookshelf.js,如何以原子方式更新模型记录?
【发布时间】:2016-07-18 02:30:10
【问题描述】:

我与 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 时,我非常想选择 * where tasks.id = id and locked = 0,然后使用当前时间戳设置锁定,但是,我需要能够确定如果具有该 ID 的记录不存在,或者存在但只是被锁定。

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

【问题讨论】:

    标签: node.js express ejs bookshelf.js


    【解决方案1】:

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

    【讨论】:

    • 是的,这都是服务器端的。此时,我想我应该更新user_id = 0,locked = 0,和id = 0的记录,如果成功,那么我知道时间,用户id,当然还有我的任务ID选择回来显示在我的模板中。我要试试。
    • 好的,只要在事务中做,这样你就知道没有人会利用你的一系列查询,你可以在文档中找到它
    • 好的。我可能需要帮助来做异步(承诺)。
    • 这是肯定的,对 orm 的每次调用都需要是异步的,这将是一个承诺 XD
    【解决方案2】:

    这个问题的通用解决方案是以以下形式运行一些东西:

    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"});
    

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 2014-12-06
      • 2016-06-07
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      相关资源
      最近更新 更多