已经存在活动交易

时间:2017-01-11 06:41:21

标签: php pdo

我有一个使用提交和回滚的代码

$pdo = new dbpdo();
    $fields = ['id','last','first'];
    $values = [NULL,'asd','asd'];
    //$pdo->db->beginTransaction();
    try {
        $pdo->db->beginTransaction();
        //echo 'connected';
        //$pdo->InsertBatch('staff',implode(',',$data));
        //$pdo->InsertBatch('staff',implode(',',$fields), implode(',',$values));
        $pdo->InsertBatch('staff',$fields, $values);
        //$pdo->exec("INSERT INTO staff('id','first','last') VALUES ('NULL','asd','asd')");
        //$pdo->execute();
        $pdo->commit();
        //$message = 'success';
        echo 'Save';
    } catch (Exception $e) {
        //die("Unable to connect: " . $e->getMessage());
        $pdo->rollBack();
        //$message = 'sayop';
        //die("Unable to connect: " . $e->getMessage());
        echo "Failed: " . $e->getMessage();
    }

我的问题是。当我执行这个。 。是说。已有活动事务,数据未保存在数据库中。 。 dbpdo类具有扩展PDO类。

2 个答案:

答案 0 :(得分:0)

我今天在这里得到了相同的场景......我试图在Firebird上插入一些主 - 详细记录并获得已经存在活动事务错误。

我的解决方案是启用和禁用自动提交选项,试试这个:

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0)

在致电$pdo->db->beginTransaction()

之前

当您完成交易时,请重新启用自动提交:

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1)

参考: http://php.net/manual/pt_BR/pdo.begintransaction.php#113602

答案 1 :(得分:0)

有时您正在打开连接,但并未关闭。 例如:

function insert($object){
        try {                
            $this->_DB->beginTransaction(); // OPEN TRANSATION
            $query  = 'INSERT INTO table VALUES (?,?,?,?)';
            $stmt   = $this->_DB->prepare($query);
            $stmt->execute( [$object->id, $object->name, $object->last_name, $object->email] );
            $this->_DB->commit(); //CLOSE -> In some function it must be missing!
            return $stmt->rowCount();
        } catch (Exception $e) {
            $this->_DB->rollBack();
            return $e->getMessage();
        }
}