NextJs + Prisma更新记录时出现Record to update not found问题排查
解答
是的,核心问题和你猜测的方向一致,但更准确的原因是重复请求触发的冲突:
Prisma的update操作本身是原子性的,不会出现“查询到记录后,更新前被其他请求修改”的中间状态。但如果同一个验证链接被多次快速访问(比如用户误点两次、浏览器重复发起请求),第一次请求会成功找到记录并将verifyId设为null,第二次请求到达时,数据库中已经没有对应verifyId的记录,就会触发P2025错误。
解决方案
- 前端限制重复触发:给验证按钮添加点击状态锁,点击后立即禁用,避免用户重复提交。
- 后端缓存已使用的verifyId:将已处理过的
verifyId存入缓存(如Redis),设置合理的过期时间,请求过来先检查缓存,已存在则直接返回错误页。 - 改用主键定位更新:如果表中有主键(如
id),可以先通过verifyId查询出记录的主键,再用主键执行更新操作。虽然这不会解决重复请求的问题,但能避免“定位字段被修改”的潜在风险:// 示例代码 const letter = await prisma.letter.findUnique({ where: { verifyId: verifyId } }); if (!letter) { return { redirect: { destination: "/letter/verifyError", permanent: false } }; } const updatedLetter = await prisma.letter.update({ where: { id: letter.id }, data: { verified: true, verifyId: null } });
内容的提问来源于stack exchange,提问作者larz
相关产品推荐
相关产品推荐

