使用 PDO 自动提交

Posted

技术标签:

【中文标题】使用 PDO 自动提交【英文标题】:Autocommit with PDO 【发布时间】:2017-12-27 08:09:49 【问题描述】:

我的事务回滚不起作用。 如何在使用 PDO 的 php 脚本中将 autocommit 设置为 false(或 0)(我有 InnoDB 5.7.18)?

这是我的代码:

     global $bdd;  //defined with PDO

       try                              
            $bdd->beginTransaction();
            /* my requests */
            $bdd->commit();
         catch (Exception $e) 
            $bdd->rollBack();
            return $e->getMessage();
        

        return true;
    

【问题讨论】:

PDO::beginTransaction () 方法禁用自动提交模式。 【参考方案1】:

我自己解决了我的问题:我的一些表在 MyISAM 中(而大多数在 InnoDB 中 -> 我使用旧的数据库系统...);所以回滚不适用于这些表。一旦我将它们更改为 InnoDB,它就起作用了。 感谢大家的帮助!

【讨论】:

【参考方案2】:
 $db = new PDO('mysql:dbname=employee');
 $db->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
 var_dump($db->query('SELECT @@autocommit')->fetchAll());

【讨论】:

感谢您的回答; var_dump 给了我:"array(1) [0]=> array(2) ["@@autocommit"]=> string(1) "0" [0]=> string(1) "0" ”,但是当我进入 mysql “SHOW VARIABLES WHERE Variable_name='autocommit';”时,自动提交仍然是“ON” ....并且回滚仍然不起作用... :( 确保 MySQL 中的 DROP TABLE 或 CREATE TABLE 等数据库定义语言 (DDL) 语句不能在事务中使用。 你试过了吗 - $dbh->setAttribute( PDO::ATTR_AUTOCOMMIT, 0 ); $dbh->beginTransaction(); 是的,我已经尝试过了,我只在我的事务中使用 UPDATE 请求... :(【参考方案3】:

尝试设置以下属性:

$bdd->setAttribute(PDO::ATTR_AUTOCOMMIT,0);

【讨论】:

你设置了这个属性吗?在打开与数据库的连接时尝试设置它 它也不起作用...但感谢您的帮助!

以上是关于使用 PDO 自动提交的主要内容,如果未能解决你的问题,请参考以下文章

PDO::beginTransaction

事务与自动提交

PDO 事务处理

使用 PDO/MySQL 将自动增量编号附加到电子邮件中发送和发送电子邮件

数据库2

自动提交表单