2010-08-04 3 views
4

Я получаю следующую ошибку, когда пытаюсь выполнить откат.Что вызывает ошибку отката в mySQL?

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

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

ответ

3

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

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

Еще одна идеи у меня есть, вы не начать транзакцию (которая должна отключить автоматическую фиксацию в Учении):

$connection->beginTransaction(); 
+0

Я не мог понять, как опубликовать код в комментарии, поэтому просто отправлен как ответ – rahul

+0

@ jakub-zalas В какой версии Symfony указан этот setAttribute? –

+0

Это не имеет никакого отношения к Symfony. Вопрос был о доктрине1. –

0

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

1

класс UnitOfWork.php имеет поймать блок, как:

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

      throw $e; 
} 

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

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

} 
+1

+1. Не следует ли '[rethrow]' быть вне оператора if? Таким образом, исключение всегда будет отвергнуто, даже если активная транзакция отсутствует. –

0

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

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

Если уровень вложенности существует grather, чем 0 , то вы можете сделать откат

Смежные вопросы