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。

相关推荐
恋猫de小郭几秒前
Flutter 下 AOT 一个你怎么都想不出来的 Bug ,JIT 正常的计算,在 AOT 居然算错了
android·前端·flutter
量化分析码农14 分钟前
【Python量化波动率实战 03】波动大就少拿点:波动率目标仓位的回测实证
后端
Rainmicro23 分钟前
【无标题】
java·数据库·算法
晓得迷路了26 分钟前
栗子前端技术周刊第 153 期 - Vitest 5.1、Remix v3.2、Node.js 27 Alpha...
前端·javascript·vite
驭渊的小故事32 分钟前
Spring AOP 入门:从 AOP 概念到第一个耗时统计切面
java·后端·spring
系统集成-鹰翔1 小时前
ERP单据已作废为什么商品仍不能删除,引用检查与软删除怎么查
javascript·经验分享·后端
Thanks_ks1 小时前
MySQL 的索引是什么?用图书馆的目录讲明白
数据库·sql·mysql·索引·联合索引·explain·慢查询优化
Moment1 小时前
Harness Engineering 为什么是 AI Coding 的工程底座 ❓❓❓
前端·后端·面试
风骏时光牛马1 小时前
生成一个AI面试复盘标题,只需要一个标题,不需要其他的任何文本。
前端