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

Prisma是否支持在SQL Server的select查询中使用with (nolock)?

Prisma对SQL Server WITH (NOLOCK) 查询提示的支持说明

支持结论

Prisma 自4.16.0正式版本开始,原生支持SQL Server场景下的表级查询提示配置,包含常用的WITH (NOLOCK)无锁查询语法。4.16.0之前的版本无原生配置入口,可通过原生SQL查询实现同等效果。

具体使用方式

1. 原生API配置(推荐,4.16.0及以上版本可用)

在执行findMany、findFirst、count、aggregate等读操作时,传入tableHint参数指定为NOLOCK即可,Prisma生成SQL时会自动在对应表后拼接WITH (NOLOCK)语法。

  • 单表查询示例:
// 查询活跃用户列表,主表带NOLOCK
const activeUsers = await prisma.user.findMany({
  tableHint: 'NOLOCK',
  where: {
    isActive: true
  }
})

上述代码自动生成的SQL等价于:

SELECT id, name, email, isActive 
FROM [dbo].[User] WITH (NOLOCK)
WHERE isActive = 1
  • 多表关联查询示例:
    如果查询包含关联表Join,可在关联配置中单独为关联表指定提示:
// 主表、关联订单表均加NOLOCK
const userList = await prisma.user.findMany({
  tableHint: 'NOLOCK',
  include: {
    orders: {
      tableHint: 'NOLOCK'
    }
  }
})

2. 旧版本兼容方案(4.16.0以下版本)

无原生支持时,直接通过$queryRaw接口写参数化原生SQL,手动写入WITH (NOLOCK)语法即可:

const statData = await prisma.$queryRaw`
  SELECT COUNT(*) as total, createTime
  FROM OrderRecords WITH (NOLOCK)
  WHERE createTime >= ${startDate}
  GROUP BY createTime
`

3. 全局生效方案(谨慎使用)

如果业务场景所有查询都需要无锁读,可直接在Prisma的SQL Server连接串中配置默认隔离级别为读未提交,效果等价于全表加WITH (NOLOCK):

sqlserver://<数据库地址>:<端口>;database=<库名>;user=<账号>;password=<密码>;isolationLevel=READ UNCOMMITTED

注意:该配置会影响该连接下所有Prisma生成的查询,仅适合纯统计、报表类非核心业务库使用,交易类业务禁止全局配置。

注意事项

  • tableHint参数仅对SQL Server数据源生效,在PostgreSQL、MySQL等其他数据库查询中传入该参数会直接抛出运行时错误
  • WITH (NOLOCK)对应读未提交隔离级别,会产生脏读、幻读、不可重复读问题,仅适合对数据一致性要求极低的查询场景,禁止用于订单、支付等核心链路查询
  • 不要通过修改Prisma生成的SQL模板、自定义拦截器等非官方方式注入NOLOCK语法,版本升级时极易出现兼容性问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:24:30