PDOException: There is no active transaction

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

PDOException: There is no active transaction

Сообщение IMB »

Доброго дня!
Есть самописный класс наследующий от PDO.

Код: Выделить всё

class DB extends PDO {
..................................
function __construct()
{
    $dsn = $this->dbtype .
        ':host=' . $this->dbhost .
    ' port=' . $this->dbport .
    ' dbname=' . $this->dbname .
    ' user=' . $this->dblogin .
    ' password=' . $this->dbpassw;
    $user  = $this->db[$data]['dblogin'];
    $passw = $this->db[$data]['dbpassw'];
    try {
        parent::__construct($dsn, $user, $passw,
                    array(PDO::ATTR_PERSISTENT => true));
    $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
}
...................................
function startTransaction()
{
    return parent::beginTransaction();
    //return $this->beginTransaction();
}
function commitTransaction()
{
    return parent::commit();
    //return $this->commit();
}

Данные замечательно получаются и вносятся в базы, но вот понадобилось мне использовать транзакцию, до этого никогда не сталкивался, и на выходе я получил следующее:

Код: Выделить всё

Fatal error: Uncaught exception 'PDOException' with message 'There is no active transaction' in /var/www/plan/include/class.db.php:83
Stack trace:
#0 /var/www/plan/include/class.db.php(83): PDO->commit()
#1 /var/www/plan/comments.php(541): DB->commitTransaction()
#2 /var/www/plan/index.php(140): require_once('/var/www/plan/c...')
#3 {main} thrown in /var/www/plan/include/class.db.php on line 83

Сам файл содержит следующий код:

Код: Выделить всё

<?php
.........................
$db = new DB();
............................
$db->startTransaction();
....................................
$db->commitTransaction();

Похоже, что я не корректно написал класс, но в чём ошибка?
Спасибо.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: PDOException: There is no active transaction

Сообщение serzh-z »

Что возвращает beginTransaction()?
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: PDOException: There is no active transaction

Сообщение IMB »

Ошибок не возвращает, использую следующую конструкцию.

Код: Выделить всё

if (!$db->startTransaction())
                    die($h->printP($h->printStrong('Не могу начать транзакцию!'),
                                                   array('class' => 'error')));
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: PDOException: There is no active transaction

Сообщение serzh-z »

IMB
А что за PDO-драйвер используется? Проблема явно ниже уровня PDO - в неправильном использовании драйвера или в самом драйвере.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: PDOException: There is no active transaction

Сообщение IMB »

Сейчас это работа с PostgreSQL, использую php5-pgsql 5.2.6.dfsg.1-1+lenny8
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: PDOException: There is no active transaction

Сообщение serzh-z »

IMB
Я бы попробовал упростить, для начала, пример. Создать нативный объект PDO для PostgreSQL и на нём выполнить примитивный запрос с beginTransaction() и commit().

Возможно, что нужно вручную отключить автокоммит через setAttributes().
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: PDOException: There is no active transaction

Сообщение IMB »

Спасибо, буду разбираться.
Чтение документации дало следующее:

Код: Выделить всё

PDO::ATTR_AUTOCOMMIT  (available in OCI, Firebird and MySQL): Whether to autocommit every single statement

И это

Код: Выделить всё

bool PDO::beginTransaction  ( void  )

Turns off autocommit mode. While autocommit mode is turned off, changes made to the database via the PDO object instance are not committed until you end the transaction by calling PDO::commit().
Calling PDO::rollBack() will roll back all changes to the database and return the connection to autocommit mode.

Не значит ли это, что в PostgreSQL не требуется принудительно указывать коммит транзакции, и возможно, начало транзакции?
Спасибо сказали: