You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js的Bookshelf/Knex单次查询中添加WITH(NO LOCK)?

在Bookshelf查询中单独添加WITH(NO LOCK)(基于Knex实现)

因为Bookshelf底层依赖Knex,你可以通过干预Knex查询构建器的方式,仅在当前API调用中添加WITH(NOLOCK)条件,不会影响模型的其他使用场景。

修改后的查询代码

User.forge()
  .query(qb => {
    // 给User表添加WITH(NOLOCK),两种方式二选一
    // 方式1:直接拼接SQL片段(兼容所有支持NOLOCK的数据库)
    qb.from('users WITH(NOLOCK)');
    // 方式2:使用Knex内置的noLock方法(针对SQL Server,需确认Knex版本支持)
    // qb.noLock();
  })
  .fetchAll({
    withRelated: [{
      role: qb => {
        // 若关联的role表也需要NOLOCK,同样处理
        qb.from('roles WITH(NOLOCK)');
        // qb.noLock();
      }
    }]
  })
  .then(function(result) {
    res.json({ data: result ? result.toJSON() : [] });
  })
  .catch(err => {
    res.json({ error: err.message });
  });

关键说明

  1. .query()方法的作用:该方法允许你直接操作底层的Knex查询构建器,自定义当前查询的SQL逻辑,仅对本次查询生效,不会修改模型的全局配置。
  2. 关联表的处理:如果关联的role表也需要添加NOLOCK,在withRelated数组中对关联项传入查询构建器函数,重复上述操作即可。
  3. 为什么User.forge('WITH(NO LOCK)')无效:forge()方法用于初始化模型实例,参数是模型的属性数据,并非查询语句,所以无法通过这种方式添加锁条件。

内容的提问来源于stack exchange,提问作者app

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:39:36