PHP mysqli Multi Query + Transaction

时间:2012-08-31 15:15:35

标签: php mysql transactions mysqli

我有以下代码:

...
$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上正确使用该交易?

2 个答案:

答案 0 :(得分:3)

来自MySQL Reference ManualTRUNCATE TABLE(重点是我的):

  

逻辑上,TRUNCATE TABLE类似于DELETE语句   删除所有行,或DROP TABLE和CREATE TABLE的序列   声明。为了实现高性能,它绕过了DML方法   删除数据。因此,无法回滚,它不会导致ON   DELETE触发器触发,无法对InnoDB表执行   与父子外键关系。

如果您希望能ROLLBACK,则必须使用DELETE语句。它们在这里效率较低,但应该给你理想的行为。

答案 1 :(得分:0)

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

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