PHP8で「PDOException: There is no active transaction」エラー

PHP8を使用している際に「PDOException: There is no active transaction」というエラーに遭遇した場合の対処法について解説します。

環境

  • PHP 8.0
  • MySQL 8.0

問題

「PDOException: There is no active transaction」というエラーが発生しました。

調査を進めていくと、トランザクションの中でテーブルをtruncateする際にこのエラーが発生していることがわかりました。

以下に、問題を再現するための最小限のコードを示します。

public function testTruncate(): void
{
    DB::transaction(function () {
        MyModel::query()->truncate();
    });
}

原因

このエラーの原因は、PHP 8.0でのPDO MySQLの扱いの変更にあります。
PHP 8.0では、トランザクションの状態がより厳格に管理されています。
これはPHPの公式マニュアルで確認できます。

また、MySQLのTRUNCATE TABLEステートメントは実行されると暗黙のコミットが発生します。
この点についてはMySQL 8.0 リファレンスマニュアルに詳細が記載されています。

truncateを実行すると、暗黙のコミットによりトランザクションが終了してしまいます。
その結果、トランザクションが存在しなくなり、「PDOException: There is no active transaction」というエラーが発生するのです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください