Доктрина DBAL Сделки - PullRequest
       19

Доктрина DBAL Сделки

3 голосов
/ 23 июля 2011

Я не очень понимаю, как выполнять транзакции в DBAL

У меня есть следующий скрипт, который обновляет столбец в зависимости от идентификатора строки.Я поместил поддельный идентификатор, который не существует в таблице (поэтому невозможно выполнить обновление), но первые обновления фиксируются, несмотря на то, что это транзакция.Я ожидаю, что все транзакции потерпят неудачу, если одна из них потерпит неудачу.

 $conn -> beginTransaction();
   try{
       $try = $conn->prepare("update table set column = '123' where id = 0"); //column exists
       $try->execute();
       $try = $conn->prepare("update table set column = '123' where id = 1"); //column exists
       $try->execute();
       $try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists
       $try->execute();

       $try = $conn->commit();
   }
   catch(Exception $e) {
       $try = $conn->rollback();
       throw $e;
   }

Ожидаемые результаты, обновлений нет, поскольку строки с id = 120 не существует. Реальные результаты, Все строки обновляются за исключением несуществующей строки.

Я заранее извиняюсь, но объектно-ориентированное программирование все еще для меня Антарктида.

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Я знаю, что этот вопрос довольно старый, поэтому я немного объясню, если кто-то столкнется с подобной проблемой в будущем , потому что это поведение не является ошибкой.

$try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists
$try->execute();

здесь условие обновления ссылается на несуществующий столбец, поэтому запрос не потерпит неудачу, он обновит 0 (ноль) строк;в Doctrine количество затронутых строк возвращается методом execute().

Вы можете вызвать исключение, чтобы вызвать откат.

$try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists
$affected = $try->execute();
if ($affected == 0) {
  throw new Exception('Update failed');
}
1 голос
/ 23 июля 2011

Этот код выполняет откат транзакции только при возникновении исключения.

Если обновление не выполнено, возвращается false, а не исключение.

Вы можете попробовать без исключений:

$try = $conn->commit();
if (!$try) {
   $conn->rollback();
}

или сгенерировать исключение, если результат false.

...