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
相关产品推荐
相关产品推荐

