我希望看到rollback的效果。但是每次运行代码时,即使我调用了回滚,表也会被删除。 我有以下代码
<?php
define('DBNAME','test');
define('DBUSER','root');
define('DBHOST','localhost');
define('PASS','');
$dbh = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME,DBUSER,PASS);
/* Begin a transaction, turning off autocommit */
$dbh->beginTransaction();
$sth = $dbh->prepare("DROP TABLE calendar2");
$result = $sth->execute();
/* Change the database schema and data */
if(!$result )
$dbh->commit();
else
$dbh->rollback();
?>
答案 0 :(得分:1)
注意:并非所有数据库都允许事务对DDL语句进行操作:某些数据库将生成错误,而其他数据库(包括MySQL)将在遇到第一个DDL语句后自动提交事务。 - http://php.net/manual/en/pdo.commit.php
MySQL中的DROP TABLE
或CREATE TABLE
等数据库定义语言(DDL)语句不能在事务中使用。
在事务中发出数据库定义语言(DDL)语句(如
COMMIT
或DROP TABLE
时,某些数据库(包括MySQL)会自动发出隐式CREATE TABLE
。隐式COMMIT
将阻止您回滚事务边界内的任何其他更改。 - http://php.net/manual/en/pdo.rollback.php
因此,当发出DDL语句时,它就像在DDL语句之后立即调用commit()
一样。您无法回滚DDL语句,并且因为隐式调用commit()
,您也无法在DDL语句之前回滚任何内容。