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。

相关推荐
考虑考虑4 小时前
JDK26中的Map.ofLazy
java·后端·java ee
剪刀石头布啊4 小时前
vue-react为何要虚拟dom
前端
剪刀石头布啊4 小时前
ahooks常用的一些库,我们使用一下
前端
剪刀石头布啊4 小时前
从git更新本地提交记录到更新已经推送到远端记录
前端
云浪5 小时前
Go 并发实战:从零实现一个高并发安全的任务调度器
javascript·后端·go
苏三的开发日记5 小时前
Docker 启动顺序优化(CentOS / Ubuntu)
后端
Flynt6 小时前
axios 被投毒半年后,我把 npm 的"安全防线"实测了一遍:最信任的 SHA512 是安慰剂
前端·npm·node.js
excel7 小时前
Base62 和 Base64 有什么区别?
前端
高频因子挖掘机7 小时前
同一交易日出现重复 K 线:去重前先确认时间、来源和粒度
后端·github·api
feely02088 小时前
《我写了 31 个静态扫描插件,踩了 7 个「假绿」》
后端