💬

PrismaのinteractiveTransactionsを使うとCPUが100%になる問題

2022/02/07に公開

解決方法

Prismaを3.9.0で解決されたので、アップデートすることです。

事象

Prismaのトランザクションを行う方法はいくつかあるのですが、そのうちinteractiveTransactions という機能があります。この機能はPreview Featureなので、βリリース的な扱いですが、使ってみてくださいといった形でリリースされていました。

しかし、実際にinteractiveTransactions使ってみると、CPUが100%になってしまうという問題がありました。

自分が体験した例としては、、以下のように、データの更新と、AWSのSESを使ってのメールの送信を一括でトランザクションで囲みたかったのですが、ローカル環境で、開発やテストをしてたときには、問題なかったのですが、AWSのインフラ上でのQA環境でテストしていた際に、CPUが100%を超えて落ちてしまい、interactiveTransactions を使うのはやめて、自前で、ロールバック処理を書いていました。

interactiveTransactionsを使う例:


try {
  await prisma.$transaction(async (prisma) => {

    // mailを送信する
    await AwsUtils.sendEmail(params);
  
    // メールが送信完了したら、ユーザーステータスを更新する
    await prisma.user.update({
      where: { id: userId },
      data: { status: emailSent },
    });

  });
}catch(err) {
  ..// error処理
}

interactiveTransactionsを使わずに自前でロールバック処理の例:


try {
  // mailを送信する
  await AwsUtils.sendEmail(params);
  
   // メールが送信完了したら、ユーザーステータスを更新する
  await prisma.user.update({
    where: { id: userId },
    data: { status: emailSent },
  });
}catch(err) {
  ..// ロールバック処理
  ..// error処理
}

原因

原因としては、interactiveTransactionsがデッドロックしてしまい、query-engineをブロックしてしまうからということのようです。
詳細は、以下のPRに記載されていますので、興味のある方は読んでみてください。

https://github.com/prisma/prisma-engines/pull/2619

Discussion