10-4-2 トランザクションスコープを利用したパターン
- トランザクション処理はデータベースに限ったことではない
- トランザクションスコープとは、一連の操作が全て成功するか、全て失敗する(ロールバックされる)ことを保証する範囲のことを指します。これはデータベース操作においてよく用いられますが、他のリソースに対する操作(例えば、ファイルシステムへの書き込みや、メッセージキューへのメッセージの追加など)でも同様の概念を適用することができます。
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
const user1Id = 1;
const user2Id = 2;
const transaction = await prisma.$transaction([
prisma.user.update({
where: { id: user1Id },
data: { balance: { decrement: 100 } },
}),
prisma.user.update({
where: { id: user2Id },
data: { balance: { increment: 100 } },
}),
]);
console.log(transaction);
}
main()
.catch(e => {
throw e
})
.finally(async () => {
await prisma.$disconnect()
})
- この例では、2つのユーザー間での資金の移動をトランザクション内で行っています。トランザクションは
prisma.$transaction
メソッドを使用して開始され、配列内の全ての操作が成功するとコミットされ、何か一つでも失敗するとロールバックされます。
参考
ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本