PHP PDO 事务问题

Posted

技术标签:

【中文标题】PHP PDO 事务问题【英文标题】:PHP PDO transaction issues 【发布时间】:2011-09-20 21:10:28 【问题描述】:

我有一个简单的 try catch,它的运行方式与我预期的不同。这是我第一次尝试使用带有 PDO 的事务:

try
        
            $dbo = Db::init();
            $dbo->beginTransaction();
            $dbo->exec("TRUNCATE TABLE $this->table");
            $dbo->exec($insert);
            $dbo->commit();
        
        catch(Exception $e)
        
            $dbo->rollBack();
            echo 'Failed to sync ' . $this->table; 
        

问题是,如果$dbo->exec($insert); 失败,$dbo->exec("TRUNCATE TABLE $this->table"); 不会回滚。有什么想法吗?

【问题讨论】:

一个字符串(正在工作)。但是,如果我故意在其中放入语法错误以使其抛出异常,则当它回滚时,它不会回滚到擦除表发生之前 【参考方案1】:

TRUNCATE 无法回滚。请改用DELETE

【讨论】:

有了这个保留表和它的结构?我只想删除数据而不是表本身。 @Headspin: DELETE FROM table --- 将删除所有行(虽然会更慢,但支持回滚) @Headspin: DELETE FROM tablename【参考方案2】:

假设您使用的是 mysql,TRUNCATE TABLE 有一个隐式 COMMIT。来自http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html 的文档:

As of MySQL 5.0.8, truncate operations cause an implicit commit. Before 5.0.8, truncate operations are not transaction-safe; an error occurs when attempting one in the course of an active transaction. 

【讨论】:

以上是关于PHP PDO 事务问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO - 没有活动事务

PHP PDO 事务自动回滚

PDO / PHP / MySQL 中的性能:事务与直接执行

PHP PDO 事务?

PHP PDO 执行失败时事务会回滚吗?

PHP PDO MySQL 以及它如何真正处理 MySQL 事务?