2

我有以下代码:

...
$mysqli->autocommit(FALSE);

if(in_array('files',$item)){
            $sql_el_truncate = "
                TRUNCATE TABLE `article_files`;
                TRUNCATE TABLE `files`;
                TRUNCATE TABLE `gallery_files`;
                TRUNCATE TABLE `image_captions`;
            ";

            $mysqli->multi_query($sql_el_truncate);

            do{ 
                $mysqli->use_result(); 
            }while ($mysqli->next_result()); 


            if ($mysqli->errno) { 
                $valid_entry = 0;
            } 
            echo $valid_entry;
        }

if( $valid_entry){
            $mysqli->commit();
        }else{
            $mysqli->rollback();
        }

...

出错时,我得到一个正确的$valid_entry值 0,但回滚不起作用。即使我故意错误地编写了一些 TRUNCATE 命令,它仍然会运行其余命令,给我错误但它不会回滚。

任何人都知道我怎样才能正确使用交易mysqli

4

2 回答 2

3

来自MySQL 参考手册TRUNCATE TABLE重点是我的):

从逻辑上讲,TRUNCATE TABLE 类似于删除所有行的 DELETE 语句,或一系列 DROP TABLE 和 CREATE TABLE 语句。为了达到高性能,它绕过了删除数据的 DML 方法。因此,它不能回滚,它不会导致 ON DELETE 触发器触发,并且不能对具有父子外键关系的 InnoDB 表执行。

如果你想能够,ROLLBACK你将不得不使用DELETE语句。他们在这里效率较低,但应该给你想要的行为。

于 2012-08-31T15:22:48.837 回答
0

在我看来,那些 TRUNCATE 命令会导致隐式提交:

http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html

于 2012-08-31T15:27:51.940 回答