Перейти к содержимому

11. Транзакции

Транзакции гарантируют атомарность операций: либо все изменения применяются успешно, либо ни одно из них не применяется. Это критически важно для сохранения согласованности данных.

Самый простой способ: передать массив Prisma-операций в $transaction. Они выполнятся в одной транзакции:

const [user, post] = await prisma.$transaction([
prisma.user.create({ data: { email: '[email protected]' } }),
prisma.post.create({ data: { title: 'Первый пост', authorId: 1 } }),
])

Более гибкий подход с коллбэком. Позволяет принимать решения на основе промежуточных результатов:

const result = await prisma.$transaction(async (tx) => {
// Проверить баланс
const account = await tx.account.findUnique({
where: { id: fromAccountId },
})
if (account.balance < amount) {
throw new Error('Недостаточно средств')
}
// Снять средства
await tx.account.update({
where: { id: fromAccountId },
data: { balance: { decrement: amount } },
})
// Зачислить средства
await tx.account.update({
where: { id: toAccountId },
data: { balance: { increment: amount } },
})
return { success: true }
})
await prisma.$transaction(async (tx) => {
// ...операции...
}, {
maxWait: 5000, // максимальное ожидание начала транзакции (мс)
timeout: 10000, // максимальное время выполнения (мс)
})

Prisma также поддерживает вложенные записи без явных транзакций — они автоматически оборачиваются в транзакцию:

await prisma.user.create({
data: {
posts: { create: [{ title: 'Пост 1' }, { title: 'Пост 2' }] },
profile: { create: { bio: 'Разработчик' } },
},
})