Transactions and batch queries {prisma}
- aliases
- No value
- tags
- prisma/client
- description
- No value
- links
- https://www.prisma.io/docs/orm/prisma-client/queries/transactions 0180 Prisma ๐
- status
- No value
- project
- true
- area
- false
- resource
- false
- title
- Transactions and batch queries {prisma}
- created
- 2025-07-08T22:29:37
- updated
- 2026-05-15T00:00:00
๋ฌธ์ ์์
Transactions and batch queries๋ฅผ ์ฃผ์๊น๊ฒ ์ฝ์ ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๊ฐ ์ง์ผ์ผ ํ๋ ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ํ๋ฆฌ์ฆ๋ง๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ป๊ฒ ๋ฌ์ฑํ ์ ์๋์ง ์์๋ด ์๋ค.
Prisma Client๋ ํธ๋์ญ์ ์ ํ๋์ API๋ก๋ง ์ ๊ณตํ์ง ์๋๋ค. ๊ฐ์ "์ฌ๋ฌ ์์ ์ ํ ๋ฒ์ ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ๊ฒ ๋ง๋ ๋ค"๋ ๋ชฉ์ ์ด๋ผ๋, ์์ ์ ์์กด์ฑ์ ๋ฐ๋ผ ์ ํ์ง๊ฐ ๋ฌ๋ผ์ง๋ค.
| ์ํฉ | Prisma์ ์ ํ์ง | ํต์ฌ ์ง๋ฌธ |
|---|---|---|
| ๊ฐ์ ๋ชจ๋ธ์ ์ฌ๋ฌ ๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ๋ณ๊ฒฝํ๋ค | Batch operations | ๊ฐ ๋ ์ฝ๋๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ธ๊ฐ? |
| ๋ถ๋ชจ์ ์์ ๋ ์ฝ๋๋ฅผ ํจ๊ป ์์ฑ/์์ ํ๋ค | Nested writes | ๋ค ์์ ์ด ์ ์์ ์ ์์ฑ ID์ ์์กดํ๋๊ฐ? |
| ์ฌ๋ฌ ์ฟผ๋ฆฌ ์ฌ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ด ํ์ํ๋ค | Interactive transactions | ์ฝ๊ณ ํ๋จํ ๋ค ๊ฐ์ ์์์ ๊ฒฝ๊ณ ์์์ ๋ค์ ์จ์ผ ํ๋๊ฐ? |
| ์๋ก ๋ค๋ฅธ ๋ชจ๋ธ์ ๋ ๋ฆฝ ์์ ์ ํ ๋ฒ์ ๋ฌถ๋๋ค | $transaction([]) |
๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค ์ ์๋๊ฐ? |
Batch operations
Batch operations๋ ๊ฐ์ ๋ชจ๋ธ์ ๋ํ ๋ค๊ฑด ์์ ์ ํ๋์ ์ฟผ๋ฆฌ๋ก ํํํ๋ค. Prisma ๋ฌธ์์์ ํธ๋์ญ์ ์ผ๋ก ์คํ๋๋ค๊ณ ์ค๋ช ํ๋ ๋ํ API๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Bulk operations
createManycreateManyAndReturnupdateManyupdateManyAndReturndeleteMany
์๋ฅผ ๋ค์ด ์ฌ๋ฌ ์ด๋ฉ์ผ์ ์ฝ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ๊ฐ ์ด๋ฉ์ผ์ ์
๋ฐ์ดํธ๊ฐ ์๋ก ๋
๋ฆฝ์ ์ด๋ค. ์ด๋ด ๋๋ ์ด๋ฉ์ผ ํ๋๋ง๋ค update๋ฅผ ๋ฐ๋ณตํ๊ฑฐ๋ $transaction([])์ ์์ญ ๊ฐ์ update๋ฅผ ๋ฃ๊ธฐ๋ณด๋ค updateMany๊ฐ ๋ ๋จ์ํ๋ค.
await prisma.email.updateMany({
where: {
userId,
unread: true,
},
data: {
unread: false,
},
})
Batch operations๋ "๊ฐ์ ๋ชจ๋ธ, ๊ฐ์ ๋ณ๊ฒฝ ๊ท์น, ๋ ๋ฆฝ์ ์ธ ๋ ์ฝ๋"๋ผ๋ ์กฐ๊ฑด์ด ๋ง์ ๋ ๊ฐ์ฅ ๋จผ์ ๊ณ ๋ คํ ์ ํ์ง๋ค. ๋ค๋ง ์ฌ๋ฌ ๋ชจ๋ธ์ ํจ๊ป ๋ค๋ฃจ๊ฑฐ๋, ๊ฐ ๋ ์ฝ๋๋ณ๋ก ๋ค๋ฅธ ๊ด๊ณ ์์ ์ด ํ์ํ๋ฉด ์ ํฉํ์ง ์๋ค.
Nested writes
Nested writes๋ ๊ด๋ จ๋ ๋ ์ฝ๋๋ค์ ํ๋์ Prisma ์ฟผ๋ฆฌ ์์์ ํจ๊ป ์ฐ๋ ๋ฐฉ์์ด๋ค. ์ฌ์ฉ์๋ ํ ๋ฒ์ create ๋๋ update๋ฅผ ํธ์ถํ์ง๋ง, Prisma๋ ๋ด๋ถ์ ์ผ๋ก ๊ด๋ จ ์ฐ๊ธฐ ์์
๋ค์ ํ๋์ ํธ๋์ญ์
์ผ๋ก ๋ฌถ๋๋ค.
const team = await prisma.team.create({
data: {
name: 'Aurora Adventures',
members: {
create: {
email: 'alice@prisma.io',
},
},
},
})
์ด ๋ฐฉ์์ด ์ค์ํ ์ด์ ๋ dependent writes ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด Team์ ๋ง๋ ๋ค ๊ทธ Team.id๋ฅผ ์ฌ์ฉํด User๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค๋ฉด, ๋ค ์์
์ ์ ์์
์ ๊ฒฐ๊ณผ์ ์์กดํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ID๋ฅผ ์์ฑํ๋ ๊ตฌ์กฐ๋ผ๋ฉด $transaction([]) ๋ฐฐ์ด ์์ ๋ค์ ์ฟผ๋ฆฌ๋ก ๊ทธ ID๋ฅผ ๋๊ธธ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ Nested writes๊ฐ ๋ ์์ฐ์ค๋ฝ๊ณ ์์ ํ๋ค.
No - neither updateMany nor deleteMany currently supports nested writes. For example, you cannot delete multiple teams and all of their members (a cascading delete):
await prisma.team.deleteMany({
where: {
id: {
in: [2, 99, 2, 11],
},
},
data: {
members: {}, // Cannot access members here
},
})
Nested writes๋ ๊ด๊ณ ๊ทธ๋ํ๋ฅผ ํ ๋ฒ์ ์ฐ๊ธฐ ์ข์ง๋ง, bulk operation๊ณผ ๊ฒฐํฉ๋์ง๋ ์๋๋ค. updateMany, deleteMany ์์์ ๊ด๊ณ ํ๋๋ฅผ ํ๊ณ ๋ค์ด๊ฐ ์์ ๋ ์ฝ๋๋ฅผ ํจ๊ป ์์ ํ๊ฑฐ๋ ์ญ์ ํ ์๋ ์๋ค.
$transaction([]) API
$transaction([]) API๋ ์ฌ๋ฌ Prisma Client ์ฟผ๋ฆฌ๋ฅผ ๋ฐฐ์ด๋ก ๋๊ฒจ ์์๋๋ก ์คํํ๊ณ , ํ๋๋ผ๋ ์คํจํ๋ฉด ์ ์ฒด๋ฅผ ๋กค๋ฐฑํ๋ค. ์ฃผ๋ก ์๋ก ๋ค๋ฅธ ๋ชจ๋ธ์ ๋
๋ฆฝ์ ์ธ ์์
๋ค์ ํ๋์ ์์์ ๊ฒฝ๊ณ๋ก ๋ฌถ์ ๋ ์ฌ์ฉํ๋ค.
UseCase: ์ฌ๋ฌ ํ ์ด๋ธ์ ๊ฑธ์น Delete Operation
const id = 9 // User to be deleted
const deletePosts = prisma.post.deleteMany({
where: {
userId: id,
},
})
const deleteMessages = prisma.privateMessage.deleteMany({
where: {
userId: id,
},
})
const deleteUser = prisma.user.delete({
where: {
id: id,
},
})
await prisma.$transaction([deletePosts, deleteMessages, deleteUser]) // Operations succeed or fail together
์ฌ๊ธฐ์๋ Post, PrivateMessage, User๋ผ๋ ์๋ก ๋ค๋ฅธ ๋ชจ๋ธ์ ํจ๊ป ์ญ์ ํด์ผ ํ๋ค. ๋จ์ผ deleteMany๋ก ํํํ ์ ์๊ณ , ๊ฐ ์ฟผ๋ฆฌ๋ ์ญ์ ๋์ ์ฌ์ฉ์ ID๋ง ์๋ฉด ๋ฏธ๋ฆฌ ๋ง๋ค ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ $transaction([])๊ฐ ์ ํฉํ๋ค.
UseCase: pre-computed ID๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ
๋ฌธ์์์๋ UUID๋ฅผ ์ฌ์ฉํ์์ผ๋, ๋ด๊ฐ ์๊ธฐ๋ก ObjectId๋ ์ ํ๋ฆฌ์ผ์ด์ ๋จ์์ ์์ฑ์ด ๊ฐ๋ฅํ๋ค๊ณ ๋ค์๋๋ฐ, ๊ตณ์ด Nested Write๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋ ๋ฆฝ์ ์ธ ์คํผ๋ ์ด์ ๋ค๋ก ๋ถ๋ฆฌํ ๋ค์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ์คํํ๋ ๊ฒ๋ ์ ๊ทน์ ์ผ๋ก ๋์ ํด๋ณผ ์ ์๊ฒ ๋ค.
import { v4 } from 'uuid'
const teamID = v4()
const userID = v4()
await prisma.$transaction([
prisma.user.create({
data: {
id: userID,
email: 'alice@prisma.io',
team: {
id: teamID,
},
},
}),
prisma.team.create({
data: {
id: teamID,
name: 'Aurora Adventures',
},
}),
])
ํต์ฌ์ ID๋ฅผ ๋ฏธ๋ฆฌ ์๊ณ ์๋๋์ด๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ID๋ฅผ ์์ฑํ๋ฉด ๋ค ์ฟผ๋ฆฌ๊ฐ ์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ฏ๋ก Nested writes๊ฐ ๋ง๋ค. ๋ฐ๋๋ก UUID๋ ObjectId์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์
์ด ID๋ฅผ ๋จผ์ ๊ณ์ฐํ ์ ์๋ค๋ฉด, ๊ฐ ์ฟผ๋ฆฌ๋ ์๋ก์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์๋ ๋๋ฏ๋ก $transaction([])๋ก ๋ถ๋ฆฌํ ์ ์๋ค.
๋ค๋ง Prisma ๋ฌธ์๋ ์ด๋ฏธ ์๋ ์์ฑ ID์ Nested writes๋ฅผ ์ ์ฐ๊ณ ์๋ค๋ฉด, ์๋ ID ์์ฑ๊ณผ $transaction([])๋ก ๊ตณ์ด ๋ฐ๊ฟ ๊ฐํ ์ด์ ๋ ์๋ค๊ณ ์ค๋ช
ํ๋ค. $transaction([])๋ "๋ ๊ฐ๋ ฅํ API"๋ผ๊ธฐ๋ณด๋ค "์์
๋ค์ ๋
๋ฆฝ์ ์ธ PrismaPromise๋ก ๋ฏธ๋ฆฌ ๊ตฌ์ฑํ ์ ์์ ๋ ์ฐ๋ API"์ ๊ฐ๊น๋ค.
Interactive transactions
Interactive transactions๋ ์ฝ๋ฐฑ ํํ์ $transaction(async (tx) => { ... })์ด๋ค. ๋ฐฐ์ดํ $transaction([])์ ๋ฌ๋ฆฌ, ํธ๋์ญ์
๋ด๋ถ์์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ณ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ผ๋ก ํ๋จํ ๋ค์ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ค.
const result = await prisma.$transaction(async (tx) => {
const sender = await tx.account.update({
where: { email: 'alice@prisma.io' },
data: { balance: { decrement: 100 } },
})
if (sender.balance < 0) {
throw new Error('Insufficient funds')
}
return tx.account.update({
where: { email: 'bob@prisma.io' },
data: { balance: { increment: 100 } },
})
})
์ด ์์ ๋ ์ ํ์ ์ธ read-modify-write ํ๋ฆ์ด๋ค. ์ฒซ ๋ฒ์งธ ์ฐ๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์์ก์ด ์์์ธ์ง ๊ฒ์ฌํ ๋ค, ์กฐ๊ฑด์ ๋ง์กฑํ ๋๋ง ๋ ๋ฒ์งธ ์ฐ๊ธฐ๋ฅผ ์ํํ๋ค. ์ค๊ฐ์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์ ์ ๋กค๋ฐฑ๋๋ค.
Interactive transactions๋ ๊ฐ๋ ฅํ์ง๋ง ๋น์ฉ์ด ์๋ค. ํธ๋์ญ์ ์ด ์ด๋ฆฐ ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ๋ถ์ก๊ณ ์์ผ๋ฏ๋ก, ์ค๋ ์คํ๋๋ ๋ก์ง์ ๋ฃ์ผ๋ฉด ์ฑ๋ฅ ์ ํ๋ deadlock ์ํ์ด ์ปค์ง๋ค. Prisma ๋ฌธ์๋ ํธ๋์ญ์ ์ ์งง๊ฒ ์ ์งํ๋ผ๊ณ ๊ถํ๋ค. ๋ฐ๋ผ์ ํธ๋์ญ์ ๋ด๋ถ์๋ ๊ผญ ํ์ํ DB ์ฝ๊ธฐ/์ฐ๊ธฐ์ ์งง์ ํ๋จ ๋ก์ง๋ง ๋๋ ํธ์ด ์ข๋ค.
await prisma.$transaction(
async (tx) => {
// read -> decide -> write
},
{
maxWait: 5000,
timeout: 10000,
},
)
์ธ์ Batch, Nested, Interactive๋ฅผ ์จ์ผ ํ ๊น?
1. ๋จผ์ Batch operations๋ฅผ ์์ฌํ๋ค
๊ฐ์ ๋ชจ๋ธ์ ์ฌ๋ฌ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๋๊ฐ? ๊ทธ๋ ๋ค๋ฉด createMany, updateMany, deleteMany๋ฅผ ๋จผ์ ๋ณธ๋ค.
- ์ฌ๋ฌ ์ด๋ฉ์ผ์ ์ฝ์ ์ฒ๋ฆฌํ๋ค.
- ์ฌ๋ฌ ์ฃผ๋ฌธ์ ์ํ๋ฅผ
DISPATCHED๋ก ๋ฐ๊พผ๋ค. - ์กฐ๊ฑด์ ๋ง๋ ๋ก๊ทธ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๋ค.
์ด ๊ฒฝ์ฐ์๋ ๊ฐ๋ณ ๋ ์ฝ๋๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ด๋ค. ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ด์ ์์๋ "๊ฐ ๋ ์ฝ๋๋ณ ๋๋ฉ์ธ ๊ท์น"์ด ์๋๋ผ "์งํฉ์ ๋ํ ๋์ผํ ์ํ ์ ์ด"๋ผ๋ฉด batch operation์ด ๊ฐ์ฅ ๋จ์ํ๋ค.
2. ์์ฑ๋ ID๋ ๊ด๊ณ ๊ทธ๋ํ์ ์์กดํ๋ฉด Nested writes๋ฅผ ์ด๋ค
๋ถ๋ชจ๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๋ถ๋ชจ์ ID๋ก ์์์ ๋ง๋ค์ด์ผ ํ๋๊ฐ? ํ๋์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์์ฑ ๊ณผ์ ์์ ๊ด๊ณ๋ ๋ ์ฝ๋๋ค์ด ํจ๊ป ์๊ฒจ์ผ ํ๋๊ฐ? ๊ทธ๋ ๋ค๋ฉด Nested writes๊ฐ ๋ง๋ค.
- ํ์ ๋ง๋ค๋ฉด์ ํ ๋ฉค๋ฒ๋ฅผ ํจ๊ป ๋ง๋ ๋ค.
- ์ฃผ๋ฌธ์ ๋ง๋ค๋ฉด์ ์ฃผ๋ฌธ ๋ผ์ธ์ ํจ๊ป ๋ง๋ ๋ค.
- ๊ฒ์๊ธ์ ๋ง๋ค๋ฉด์ ์ด๊ธฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๋ง๋ ๋ค.
Nested writes๋ "๊ด๊ณ๋ ์ฐ๊ธฐ"๋ฅผ Prisma ์คํค๋ง์ ๊ด๊ณ ๋ชจ๋ธ ๊ทธ๋๋ก ํํํ๋ค. ํนํ DB-generated ID๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฐฐ์ดํ $transaction([])๋ณด๋ค Nested writes๊ฐ ๋ ์ ํฉํ๋ค.
3. ๋
๋ฆฝ ์ฟผ๋ฆฌ ์ฌ๋ฌ ๊ฐ๋ฅผ ์์์ ์ผ๋ก ๋ฌถ์ผ๋ฉด $transaction([])๋ฅผ ์ด๋ค
์ฌ๋ฌ ๋ชจ๋ธ์ ๊ฑด๋๋ฆฌ์ง๋ง ๊ฐ ์ฟผ๋ฆฌ๊ฐ ์๋ก์ ์คํ ๊ฒฐ๊ณผ์ ์์กดํ์ง ์๋๊ฐ? ๊ฐ Prisma ์ฟผ๋ฆฌ๋ฅผ ํธ๋์ญ์
์์ ์ ์ ๋ฏธ๋ฆฌ ๋ง๋ค ์ ์๋๊ฐ? ๊ทธ๋ ๋ค๋ฉด $transaction([])๊ฐ ๋ง๋ค.
- ์ฌ์ฉ์ ํํด ์
post.deleteMany,privateMessage.deleteMany,user.delete๋ฅผ ํจ๊ป ์คํํ๋ค. - ์ฌ์ ์ ๊ณ์ฐํ ID๋ก ์ฌ๋ฌ ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- Prisma Client๊ฐ ์์ง ์ถฉ๋ถํ ํํํ์ง ๋ชปํ๋ ์์
์
$executeRaw์ ํจ๊ป ๋ฌถ๋๋ค.
๋ฐฐ์ดํ $transaction([])๋ ์์๋๋ก ์คํ๋์ง๋ง, ๋ฐฐ์ด ์์ ์ฟผ๋ฆฌ ์ฌ์ด์ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ ๋ผ์ ๋ฃ์ง๋ ๋ชปํ๋ค. ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ค๋ฉด Interactive transactions๋ก ๋์ด๊ฐ์ผ ํ๋ค.
4. ์ฝ๊ณ ํ๋จํ ๋ค ์จ์ผ ํ๋ฉด Interactive transactions๋ฅผ ์ด๋ค
ํธ๋์ญ์ ๋ด๋ถ์์ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ด ํ์ํ๋ฉด Interactive transactions๊ฐ ํ์ํ๋ค.
- ํ์ฌ ์ํ๋ฅผ ์ฝ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ก ๋๋ฉ์ธ ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ค.
- ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค์ ์ฐ๊ธฐ๋ฅผ ์คํํ๊ฑฐ๋ ์์ธ๋ฅผ ๋์ง๋ค.
- ์ ์ฒด ์์ ์ ํ๋์ ์์์ ๊ฒฝ๊ณ๋ก ์ฑ๊ณต/์คํจ์ํจ๋ค.
์์๋ ๊ณ์ข ์ด์ฒด, ์ฌ๊ณ ์ฐจ๊ฐ, ์ ์ฐฉ์ ์ฐธ์ฌ, ๋๊ด์ ๋์์ฑ ์ ์ด๊ฐ ํ์ํ ์ํ ์ ์ด ๋ฑ์ด๋ค. ๋ค๋ง ํธ๋์ญ์ ๋ด๋ถ์ ๋คํธ์ํฌ ํธ์ถ, ์ฌ์ฉ์ ์ ๋ ฅ ๋๊ธฐ, ๊ธด ๊ณ์ฐ์ ๋ฃ์ผ๋ฉด ํธ๋์ญ์ ์๊ฐ์ด ๊ธธ์ด์ง๋ค. Interactive transactions๋ "๋ณต์กํ ๋ก์ง์ ๋ฃ์ด๋ ๋๋ ๊ณณ"์ด ์๋๋ผ "DB ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์งง๊ฒ ํ๋จํด์ผ ํ๋ ๊ณณ"์ผ๋ก ๋ณด๋ ํธ์ด ์์ ํ๋ค.
ํ๋จ ๊ท์น ์์ฝ
flowchart TD A["์ฌ๋ฌ DB ์์ ์ด ํ์ํ๊ฐ?"] -->|์๋์ค| B["์ผ๋ฐ Prisma query"] A -->|์| C["๊ฐ์ ๋ชจ๋ธ์ ์ฌ๋ฌ ๋ ์ฝ๋์ ๊ฐ์ ๋ณ๊ฒฝ์ธ๊ฐ?"] C -->|์| D["Batch operations"] C -->|์๋์ค| E["๊ด๊ณ๋ ์ฐ๊ธฐ์ด๋ฉฐ ์์ฑ ID์ ์์กดํ๋๊ฐ?"] E -->|์| F["Nested writes"] E -->|์๋์ค| G["๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค ์ ์๋๊ฐ?"] G -->|์| H["$transaction([])"] G -->|์๋์ค| I["Interactive transactions"]
| ์ ํ์ง | ์ ๋ง๋ ๊ฒฝ์ฐ | ํผํด์ผ ํ๋ ๊ฒฝ์ฐ |
|---|---|---|
| Batch operations | ๊ฐ์ ๋ชจ๋ธ์ ๋ ๋ฆฝ ๋ ์ฝ๋๋ค์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ | ๊ด๊ณ ํ๋๋ฅผ ํจ๊ป ์ฐ๊ฑฐ๋ ๋ ์ฝ๋๋ณ ๋ค๋ฅธ ๋๋ฉ์ธ ํ๋จ์ด ํ์ํจ |
| Nested writes | ๊ด๊ณ๋ ๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์ฐ๊ณ , ์์ฑ ID ์์กด์ฑ์ด ์์ | ๊ฐ์ ๋ชจ๋ธ์ ๋๋ ์ ๋ฐ์ดํธ/์ญ์ ๋ฅผ ๊ด๊ณ ์์ ๊ณผ ํจ๊ป ์ฒ๋ฆฌํ๋ ค ํจ |
$transaction([]) |
์๋ก ๋ค๋ฅธ ๋ชจ๋ธ์ ๋ ๋ฆฝ ์ฟผ๋ฆฌ๋ฅผ ์์์ ์ผ๋ก ๋ฌถ์ | ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ก ๋ค ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํด์ผ ํจ |
| Interactive transactions | read-modify-write, ๋๋ฉ์ธ ์กฐ๊ฑด ๊ฒ์ฌ, ์งง์ ์ํ ์ ์ด | ๊ธด ์์ , ์ธ๋ถ API ํธ์ถ, ์ฌ์ฉ์ ์ ๋ ฅ ๋๊ธฐ, ๋จ์ batch ์ฒ๋ฆฌ |
๊ฒฐ๋ก ์ ์ผ๋ก Prisma์์ ํธ๋์ญ์
์ ๊ณ ๋ฅด๋ ๊ธฐ์ค์ "์ผ๋ง๋ ๋ณต์กํ๊ฐ"๊ฐ ์๋๋ผ ์ฟผ๋ฆฌ ์ฌ์ด์ ์์กด์ฑ์ด๋ค. ๋
๋ฆฝ์ ์ด๋ฉด Batch ๋๋ $transaction([]), ๊ด๊ณ ์์ฑ์ ์์กดํ๋ฉด Nested writes, ์ค๊ฐ ํ๋จ์ด ํ์ํ๋ฉด Interactive transactions๋ฅผ ์ ํํ๋ค.