对于 MySQL 用户的一个快速(也许是显而易见)的说明;
如果您使用 MyISAM 表来测试回滚,并且它不起作用,请不要挠头。
rollBack() 和 beginTransaction() 都会返回 TRUE,但回滚不会发生。
将表转换为 InnoDB 并再次运行测试。
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::rollBack — 回滚事务
回滚当前事务,该事务由 PDO::beginTransaction() 启动。
如果数据库设置为自动提交模式,则此函数在回滚事务后会恢复自动提交模式。
某些数据库(包括 MySQL)在事务中发出数据库定义语言 (DDL) 语句(例如 DROP TABLE 或 CREATE TABLE)时会自动发出隐式 COMMIT。隐式 COMMIT 将阻止您回滚事务边界内的任何其他更改。
此函数没有参数。
示例 #1 回滚事务
以下示例开始一个事务并发出两个修改数据库的语句,然后回滚更改。但是,在 MySQL 上,DROP TABLE 语句会自动提交事务,因此事务中的任何更改都不会回滚。
<?php
/* 开始事务,关闭自动提交 */
$dbh->beginTransaction();
/* 更改数据库模式和数据 */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'");
/* 识别错误并回滚更改 */
$dbh->rollBack();
/* 数据库连接现在已恢复为自动提交模式 */
?>
对于 MySQL 用户的一个快速(也许是显而易见)的说明;
如果您使用 MyISAM 表来测试回滚,并且它不起作用,请不要挠头。
rollBack() 和 beginTransaction() 都会返回 TRUE,但回滚不会发生。
将表转换为 InnoDB 并再次运行测试。
以下是如何在使用 MySQL 的 InnoDB 表时测试事务是否已启动的方法。如果使用 MySQL 的 MyISAM 表(不支持事务,但在使用时也不会返回错误),它将失败。
<?
// 开始事务
$dbh->beginTransaction();
// 要验证事务是否已启动,请尝试创建(对于 InnoDB 非法)嵌套事务。
// 如果它起作用,则第一个事务未正确启动或不受支持(例如在 MyISAM 表上)
try {
$dbh->beginTransaction();
die('取消,事务未正确启动');
} catch (PDOException $e) {
print "事务正在运行(因为尝试另一个事务失败了)\n";
}
?>
如果任何阅读本文的人因为刚刚发现他们的 MySQL 表是 MyIsam 而不是 InnoDb 而感到一丝恐慌,请不要担心...您可以使用以下查询非常轻松地更改存储引擎
ALTER TABLE your_table_name ENGINE = innodb;