【PHP8體驗】pdo_mysql 事務提交失敗

發生了什麼
週末無事,想裝上 PHP8 體驗一把新版本的特性,找了一個 Yii2 寫的老項目,結果運行 migration 初始化環境就遇到了問題,建表腳本直接報錯。php

Exception: There is no active transaction

而一樣的腳本在 7.4 版本也徹底正常。mysql

測試腳本sql

簡化的腳本差很少是這樣測試

$conn = new PDO("mysql:host=127.0.0.1;dbname=test", 'root', '123456');
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $conn->beginTransaction();
 try {
 $sql = "CREATE TABLE IF NOT EXISTS test (`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, `text` varchar(32) NOT NULL DEFAULT '', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
 $conn->exec($sql);
 
 $sql = "INSERT INTO test values(1,'test1')";
 $conn->exec($sql);
 
 $conn->commit();
 } catch (Exception $e) {
 echo $e->getMessage();
 $conn->rollBack();
 }

問題緣由code

MySQL DDL 語句會觸發隱式提交,若是事務裏執行的是其餘 DML/DQL 語句,就徹底沒問題。官方文檔裏也有提到這個問題。事務

Some databases, including MySQL, automatically issue an implicit COMMIT when a database definition language (DDL) statement such as DROP TABLE or CREATE TABLE is issued within a transaction. The implicit COMMIT will prevent you from rolling back any other changes within the transaction boundary.

可是在 PHP 8.0 之前的版本,帶來的影響只是事務被提早提交,不能回滾而已,不知道爲啥 8.0 要改爲一個異常,而且 ChangeLog 又並未提到該變動。ci

相關文章
相關標籤/搜索