| name | prisma-transaction |
| description | null |
Prisma Transaction
Category: prisma · Status: 🟢 Active
When to use
Khi nhiều thao tác ghi phải atomic: $transaction, interactive transaction.
Steps
- Nhóm các write phụ thuộc nhau vào 1
$transaction để all-or-nothing.
- Thao tác độc lập không cần đọc giữa chừng: dùng array
$transaction([...]).
- Cần logic/đọc rồi quyết định ghi: dùng interactive
$transaction(async (tx) => {...}).
- Bên trong tx dùng
tx.*, không dùng prisma.* (sẽ ngoài transaction).
- Giữ transaction ngắn; tránh gọi API/chờ ngoài DB bên trong tx (giữ lock lâu).
Template
await prisma.$transaction(async (tx) => {
const acc = await tx.account.findUniqueOrThrow({ where: { id } });
if (acc.balance < amount) throw new Error('Số dư không đủ');
await tx.account.update({ where: { id }, data: { balance: { decrement: amount } } });
await tx.ledger.create({ data: { accountId: id, amount } });
});
Example
Good: đọc-kiểm tra-ghi trong interactive tx, dùng tx., transaction ngắn gọn.
Avoid: dùng prisma. trong tx, gọi HTTP bên trong tx, ghi phụ thuộc nhau mà không bọc tx.
Checklist