在 PHP 8.0 以前的版本,包含 DDL 语句的事务只是会触发隐式提交(应该算是 MySQL 的功能,并不是 PHP 的特性),事务无法回滚,并不会抛异常。而8.0版本 commit 时会直接抛异常 There is no active transaction
。 8.0 是基于什么考虑抛这个异常出来呢?似乎在 ChangeLog 也没有提到有这个变更。
测试代码如下
$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();
}