Skip to main content

prisma-client-api-transactions

Transactions. Reference when using this Prisma feature.

跳到安装

来源信息

仓库
prisma/cursor-plugin
最近来源活动
2026年2月6日 14:17
检测到的 SKILL.md 语言
英语
星标
10
分支
1

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
2 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
prisma-client-api-transactions
description
Transactions. Reference when using this Prisma feature.
license
MIT
metadata
{"author":"prisma","version":"7.0.0"}
# Transactions Execute multiple operations atomically. ## Sequential Transactions Array of operations executed in order: ```typescript const [user, post] = await prisma.$transaction([ prisma.user.create({ data: { email: 'alice@prisma.io' } }), prisma.post.create({ data: { title: 'Hello', authorId: 1 } }) ]) ``` ### All or nothing If any operation fails, all are rolled back: ```typescript try { await prisma.$transaction([ prisma.user.create({ data: { email: 'alice@prisma.io' } }), prisma.user.create({ data: { email: 'alice@prisma.io' } }) // Duplicate! ]) } catch (e) { // Both operations rolled back } ``` ## Interactive Transactions For complex logic and dependent operations: ```typescript await prisma.$transaction(async (tx) => { // Decrement sender balance const sender = await tx.account.update({ where: { id: senderId }, data: { balance: { decrement: amount } } }) // Check balance if (sender.balance < 0) { throw new Error('Insufficient funds') } // Increment recipient balance await tx.account.update({ where: { id: recipientId }, data: { balance: { increment: amount } } }) }) ``` ### Transaction options ```typescript await prisma.$transaction( async (tx) => { // operations }, { maxWait: 5000, // Max wait to acquire lock (ms) timeout: 10000, // Max transaction duration (ms) isolationLevel: 'Serializable' // Isolation level } ) ``` ### Isolation levels | Level | Description | |-------|-------------| | `ReadUncommitted` | Lowest isolation, can read uncommitted changes | | `ReadCommitted` | Only read committed changes | | `RepeatableRead` | Consistent reads within transaction | | `Serializable` | Highest isolation, serialized execution | ## Nested Writes Automatic transactions for nested operations: ```typescript // This is automatically a transaction const user = await prisma.user.create({ data: { email: 'alice@prisma.io', posts: { create: [ { title: 'Post 1' }, { title: 'Post 2' } ] }, profile: { create: { bio: 'Hello!' } } } }) ``` ## Transaction Client The `tx` parameter is a Prisma Client scoped to the transaction: ```typescript await prisma.$transaction(async (tx) => { // Use tx instead of prisma await tx.user.create({ ... }) await tx.post.create({ ... }) // Can call methods const count = await tx.user.count() }) ``` ## OrThrow in Transactions Use with interactive transactions: ```typescript await prisma.$transaction(async (tx) => { // If not found, throws and rolls back entire transaction const user = await tx.user.findUniqueOrThrow({ where: { id: 1 } }) await tx.post.create({ data: { title: 'New Post', authorId: user.id } }) }) ``` ## Best Practices ### Keep transactions short ```typescript // Good - only DB operations in transaction const data = prepareData() // Outside transaction await prisma.$transaction(async (tx) => { await tx.user.create({ data }) }) ``` ### Handle errors ```typescript try { await prisma.$transaction(async (tx) => { // operations }) } catch (e) { if (e.code === 'P2002') { // Handle unique constraint violation } throw e } ``` ### Use appropriate isolation ```typescript // Default is fine for most cases await prisma.$transaction(async (tx) => { // operations }) // Use Serializable for strict consistency await prisma.$transaction( async (tx) => { /* operations */ }, { isolationLevel: 'Serializable' } ) ``` ## Sequential vs Interactive | Feature | Sequential | Interactive | |---------|------------|-------------| | Syntax | Array | Async function | | Dependent ops | No | Yes | | Conditional logic | No | Yes | | Performance | Better | More flexible | | Use case | Simple batch | Complex logic |
在 GitHub 查看