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」というエラーが発生するのです。