2017-01-16 1 views
1

code Exemple:PHP PDO L'annulation de la transaction en cas d'échec de l'exécution?

$pdo->beginTransaction(); 

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

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

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

    //... 
} 

Je sais que préparer peut jeter exception, et COMMIT jetteront exception s'il n'y a pas de transaction en cours d'exécution.

Mais est-il possible de se produire dans une telle situation dans laquelle la préparation réussira mais échouera? Cela ne provoquerait pas de retour en arrière? Est-ce que commit lance aussi quand l'exécution a échoué (je ne pense pas, comme la documentation dit qu'il se lance seulement quand il n'y a pas de transaction).

dois-je vérifier explicitement pour résultat d'exécution et de jeter mes propres exceptions comme celui-ci entraîne l'annulation ?:

$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

Avez-vous configuré le PDO pour lancer des exceptions sur l'erreur – RiggsFolly

+0

Mais fondamentalement, si vous n'obtenez pas de validation, la transaction doit être annulée – RiggsFolly

+0

PDO :: rollBack() lance une exception PDOException quand il s'agit de restaurer sans avoir préalablement ouvert transaction. –

Répondre

1

Je suppose que, fondamentalement, vous demandez, n'exécute() lancer une exception, si elle échoue?

Oui, c'est le cas.

Par conséquent votre code sera annulé automatiquement. Pas besoin de vérifier manuellement. Vous pouvez le tester avec une erreur de clé unique en double par exemple.

+0

Y a-t-il quelque chose dans la documentation? –

+0

Oui. La documentation indique que PDO lève des exceptions sur les erreurs si configuré. Je préférerais vous demander où avez-vous trouvé que c'est seulement préparer qui lance des exceptions. –

+0

C'est parce que la documentation dit explicitement que prepare retourne false, et seulement si pdo est configuré ainsi, il lancera une exception. En cas d'exécution, il dit seulement qu'il retournera false, et il n'y a rien à propos de lancer des exceptions, donc je dirais que la documentation n'est pas conséquente (?). –