什么是事务?
事务(Transaction)是一组数据库操作的集合,这些操作要么全部成功,要么全部失败,用于保证数据一致性。
事务核心特性(ACID)
Atomicity
原子性:全部成功或全部失败
Consistency
一致性:数据状态合法
Isolation
隔离性:事务互不干扰
Durability
持久性:提交后永久保存
Prisma 单个事务($transaction)
basic.ts
typescript
await prisma.$transaction(async (tx) => {
await tx.user.create({
data: { name: "Alice", email: "a@test.com" }
});
await tx.post.create({
data: { title: "Hello", userId: 1 }
});
});在事务中使用 tx 而不是 prisma,可以确保所有操作在同一个事务上下文中执行。
批量事务(数组方式)
batch.ts
typescript
await prisma.$transaction([
prisma.user.create({
data: { name: "A" }
}),
prisma.user.create({
data: { name: "B" }
})
]);数组形式事务会并行执行,但仍保证原子性(全部成功或全部失败)。
事务回滚机制
rollback.ts
typescript
await prisma.$transaction(async (tx) => {
await tx.user.create({
data: { name: "Alice" }
});
throw new Error("中断事务");
});一旦事务中出现错误,Prisma 会自动回滚所有已执行操作,保证数据不会出现半成功状态。
嵌套事务注意事项
nested-bad.ts
typescript
await prisma.$transaction(async (tx) => {
await tx.user.create({ data: { name: "A" } });
await prisma.post.create({ // ❌ 不要混用 prisma
data: { title: "B" }
});
});事务内必须统一使用 tx,否则会导致事务失效,数据无法保证一致性。
正确写法
nested-good.ts
typescript
await prisma.$transaction(async (tx) => {
const user = await tx.user.create({
data: { name: "A" }
});
await tx.post.create({
data: {
title: "Hello",
userId: user.id
}
});
});典型业务场景
必须使用事务的场景
支付系统
扣款 + 订单创建必须一致
库存系统
扣库存 + 创建订单
用户注册流程
用户 + profile + 权限初始化
内容发布
文章 + 标签 + 统计写入
性能注意事项
事务优化建议
事务尽量短
避免长时间锁表
避免网络调用
事务内不要请求外部 API
减少写操作
只做必要 DB 操作
合理拆分事务
复杂流程拆成多个阶段
下一步学习
进入生产级架构
连接池优化
PgBouncer / serverless
生产部署策略
Docker / CI / Prisma generate
相关笔记
在数字化一期,此笔记未产生更深相关的共鸣分枝。