Prisma có hai kiểu transaction:
- Sequential — truyền một mảng thao tác:
prisma.$transaction([op1, op2]). Chạy tuần tự, một cái fail thì rollback hết. Đơn giản nhưng không có logic điều kiện. - Interactive — truyền một hàm async:
javascript
prisma.$transaction(async (tx) => {
const user = await tx.user.create({ ... })
if (user.role === 'admin') await tx.adminProfile.create({ ... })
})Dùng được if/else. Lưu ý: bên trong phải gọi qua tx (không phải prisma) thì các thao tác mới nằm chung một transaction.
Vài điểm thêm:
- Nested write tự động bọc trong transaction: prisma.user.create({ data: { profile: { create: {...} } } }).
- Đặt được isolation level và timeout (mặc định 5s).
Giới hạn: Prisma không làm transaction trải nhiều database — với microservices phải dùng 2-phase commit hoặc saga pattern.