2017-01-16 4 views
1

Пример кода:PHP PDO Откат транзакции при выполнении сбой?

$pdo->beginTransaction(); 

try { 
    $query1 = $pdo->prepare(...); 
    $query2 = $pdo->prepare(...); 

    $query1->execute(); 
    $query2->execute(); 

    $pdo->commit(); 
} catch(Exception $e){ 
    try { 
     $pdo->rollBack(); 
    } catch(Exception $re){ 
     //... 
    } 

    //... 
} 

Я знаю, что готовить может бросить исключение, и совершить выбросит исключение, если нет транзакции работает.

Но возможно ли возникнуть такая ситуация, при которой подготовка будет успешной, но выполнение не удастся? Это не приведет к откату? Бросок также бросает, когда выполнение завершилось неудачно (я так не думаю, поскольку документация говорит, что он генерируется только при отсутствии транзакции).

Так я должен явно проверить результат выполнения и бросить свои собственные исключения, чтобы вызвать откат, как это ?:

$pdo->beginTransaction(); 

try { 

    $query1 = $pdo->prepare(...); 
    $query2 = $pdo->prepare(...); 

    if(!$query1->execute()){ 
     throw new Exception('Query1 failed to execute.'); 
    } 

    if(!$query2->execute()){ 
     throw new Exception('Query2 failed to execute.'); 
    } 

    $pdo->commit(); 
} catch(Exception $e){ 
    try { 
     $pdo->rollBack(); 
    } catch(Exception $re){ 
     //... 
    } 

    //... 
} 
+1

У вас есть PDO, настроенный на выброс исключений при ошибке – RiggsFolly

+0

Но в принципе, если вы не дойдете до Commit, транзакция должна быть откатна – RiggsFolly

+0

PDO :: rollBack() выбрасывает «PDOException», когда дело доходит до отката без предыдущего открытия сделка. –

ответ

1

я предполагаю, что в основном вы спрашиваете, не выполнить() сгенерирует исключение, если оно потерпит неудачу?

Да, это так.

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

+0

Есть ли что-нибудь об этом в документации? –

+0

Да. В документации указано, что PDO выдает исключения при ошибках, если они настроены так. Я бы предпочел спросить, откуда вы пришли, что это только подготовка, которая бросает исключения. –

+0

Это потому, что документация явно говорит, что подготовка возвращает false, и только если pdo настроен так, он будет генерировать исключение. В случае выполнения он только говорит, что он вернет false, и нет ничего о том, чтобы бросать исключения, поэтому я бы сказал, что документация не является следствием (?). –