Что вызывает ошибку отката не удалось в MySQL? - PullRequest
4 голосов
/ 04 августа 2010

При попытке выполнить откат появляется следующая ошибка.

Откат не выполнен. Нет активной транзакции.

Я искал эту проблему и нашел несколько предложений, которые рекомендуют отключить параметр автоматической фиксации. Но я не уверен, как это сделать. Есть ли какая-либо другая причина для вышеуказанной ошибки? Я использую MYSQL и Zend, и мой файл php.ini загрузил необходимые драйверы.

Ответы [ 4 ]

3 голосов
/ 04 августа 2010

MySQL по умолчанию работает в режиме автоматической фиксации. Вы можете отключить его с помощью:

$connection->setAttribute(Doctrine_Core::ATTR_AUTOCOMMIT, false);

Другая идея, которая у меня есть, заключается в том, что вы не запустили транзакцию (которая должна отключить автокоммит в Doctrine):

$connection->beginTransaction();
1 голос
/ 17 августа 2012

Класс UnitOfWork.php имеет блок перехвата, например:

catch (Exception $e) {
            $this->em->close();
            $conn->rollback();

            throw $e;
}

Конечно, если ваш класс не готов найти уже закрытый менеджер сущностей и, следовательно, соединение, выбудет иметь это исключение.Хуже всего то, что он маскирует основную причину исключения, поскольку ошибка была вызвана до выполнения блока catch.Чтобы это исправить, вы можете сделать простую проверку в блоке catch вашего класса:

catch(Exception $e) {
    if($conn->isTransactionActive()) {
         [rollback]
         [close]
         [rethrow] (if necessary)
    }

}
0 голосов
/ 06 июня 2016

Вы можете проверить, существует ли транзакция с уровнем вложенности транзакции:

$this->em->getConnection()->getTransactionNestingLevel() 

Если уровень вложенности существует больше 0, то вы можете выполнить откат

0 голосов
/ 05 августа 2010

Нашел проблему ..... Я вызывал функцию rollback () 2 раза в разных местах кода

...