首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP mysqli多查询+事务

PHP mysqli多查询+事务
EN

Stack Overflow用户
提问于 2012-08-31 23:15:35
回答 2查看 2.2K关注 0票数 2

我有以下代码:

代码语言:javascript
复制
...
$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,但回滚不起作用。即使我故意错误地编写了一些截断命令,它仍然会运行rest命令,给我错误,但它不会回滚。

任何人都知道如何正确使用mysqli上的事务

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-31 23:22:49

来自TRUNCATE TABLEMySQL Reference Manual (重点是我的):

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

如果您希望能够使用ROLLBACK,那么您将不得不使用DELETE语句。它们在这里效率较低,但应该可以提供所需的行为。

票数 3
EN

Stack Overflow用户

发布于 2012-08-31 23:27:52

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12218192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档