りゅうじの学習blog

学習したことをアウトプットしていきます。

6/3 ドメイン駆動設計 Chapter10 10-4-2

10-4-2 トランザクションスコープを利用したパターン

  • トランザクション処理はデータベースに限ったことではない
  • トランザクションスコープとは、一連の操作が全て成功するか、全て失敗する(ロールバックされる)ことを保証する範囲のことを指します。これはデータベース操作においてよく用いられますが、他のリソースに対する操作(例えば、ファイルシステムへの書き込みや、メッセージキューへのメッセージの追加など)でも同様の概念を適用することができます。
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const user1Id = 1;
  const user2Id = 2;

  // Start a transaction
  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メソッドを使用して開始され、配列内の全ての操作が成功するとコミットされ、何か一つでも失敗するとロールバックされます。

参考

ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本