💬
PrismaのinteractiveTransactionsを使うとCPUが100%になる問題
解決方法
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に記載されていますので、興味のある方は読んでみてください。
Discussion