prisma 如何处理数据库竞态

Prisma 处理数据库竞态一般靠这几种方式:

  1. 事务 $transaction
csharp 复制代码
await prisma.$transaction(async (tx) => {
  const user = await tx.user.findUnique({ where: { id } })
  await tx.user.update({
    where: { id },
    data: { balance: user.balance - 100 },
  })
})
  1. 原子更新,避免先查再改
css 复制代码
await prisma.user.update({
  where: { id },
  data: {
    balance: { decrement: 100 }, // 值字段 balance 减 100
  },
})

await prisma.users.update({
  where: { userName },
  data: {
      tokenBalance: { increment: 100 }, // 使值 加
  }
})
  1. 唯一约束 + upsert / 捕获冲突
css 复制代码
await prisma.user.upsert({
  where: { email },
  create: { email },
  update: {},
})
  1. 乐观锁 加一个 version 字段:
css 复制代码
await prisma.user.updateMany({
  where: { id, version },
  data: {
    name,
    version: { increment: 1 },
  },
})

如果更新数量是 0,说明被别人改过。

  1. 设置事务隔离级别
dart 复制代码
await prisma.$transaction(
  async (tx) => {
    // ...
  },
  { isolationLevel: 'Serializable' }
)
  1. 悲观锁 Prisma 没有直接 API,可用原生 SQL:
sql 复制代码
await tx.$queryRaw`SELECT * FROM "User" WHERE id = ${id} FOR UPDATE`

简单说:

优先用原子操作 + 唯一约束;复杂逻辑用事务;高并发冲突用乐观锁或 Serializable。

相关推荐
知行产研2 小时前
易控智驾:毛利率跃升17.2个百分点,矿山无人驾驶从“规模换增长“迈入“盈利拐点“
数据库·mysql
千里码aicood2 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
饺子大魔王的男人2 小时前
Redis 内存和连接异常怎么排查?用 redis_exporter 搭一套可远程抓取的监控链路
数据库·redis·bootstrap
可涵不会debug2 小时前
第一次学 LangGraph:用一个快递案例搞懂 State、Node、Edge 和 compile
服务器·数据库·mysql
莪_幻尘2 小时前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm
风骏时光牛马3 小时前
AI模型综合能力评测:性能、指令遵循与多场景实测对比
前端
Frag0ut3 小时前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm
IvorySQL3 小时前
PostgreSQL 日报 |RLS 机密性绕过漏洞(9 月 27 日)
数据库·postgresql
hiahiahia1233 小时前
实现完整 Tool Dispatcher
开发语言·前端