Closed1

Prisma で "Transaction already closed: Could not perform operation." と表示された場合の解決方法

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

いきなり本題

本番環境で Excel ファイルからデータベースにデータを一括登録する時に発生した。

原因は Prisma のトランザクション最大実行時間がデフォルトで 5 秒になっており、5 秒経過すると自動的に閉じられることだった。

自動的に閉じられたトランザクションで INSERT 文を実行しようとしたからタイトルのようなエラーメッセージが表示されるようだ、せめて timeout とか含まれているとわかりやすいのだが。。。

対策としては下記のようにトランザクション開始時のオプションで最大実行時間 timeout を指定する。

コード例
await prisma.$transaction(
  async (tx) => {
    // Code running in a transaction...
  },
  {
    maxWait: 5000, // default: 2000
    timeout: 10000, // default: 5000
  }
)

ちなみに maxWait はトランザクションを開始するまでの最大待機時間。

詳しい情報については下記のドキュメントで確認することができる。

https://www.prisma.io/docs/concepts/components/prisma-client/transactions#interactive-transactions

なお、ローカル開発環境で問題が発生しなかったのは Prisma と DMBS が同じマシンで実行されていて通信が高速なのでデフォルトの 5 秒以内で完了したからと考えられる。

本番環境では Cloud Run と Cloud SQL を使っており、ローカル開発環境に比べて通信に時間がかかるので顕在化したようだ。

いずれにしても解決できて良かった。

このスクラップは2023/10/01にクローズされました