transaction - PHP, MySQL, PDO-Transaktionen-Ist der Code innerhalb versuchen Block Stop bei commit()?



php pdo mysql port (2)

Ich bin ziemlich neu in Transaktionen.

Vorher war das, was ich tat, etwas wie:

Codeblock 1

$db = new PDO(...);

$stmt = $db->prepare(...);

if($stmt->execute()){
    // success
    return true;
}else{
    // failed
    return false;
}

Aber in einem Versuch, mehrere Abfragen in einer einzigen Transaktion zu gruppieren, verwende ich jetzt etwas wie:

Codeblock 2

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$db->beginTransaction();

try{
    $stmt = $db->prepare(... 1 ...);
    $stmt->execute();

    $stmt = $db->prepare(... 2 ...);
    $stmt->execute();

    $stmt = $db->prepare(... 3 ...);
    $stmt->execute();

    $db->commit();

    return true;
}catch(Exception $e){
    // Failed, maybe write the error to a txt file or something
    $db->rollBack();
    return false;
}

Meine Frage ist: Wenn die Transaktion aus irgendeinem Grund fehlschlägt, stoppt der Code bei $db->commit(); und zum catch springen? Oder wäre die return true; zuerst laufen, und dann würde es versuchen, zum catch zu gehen? Denn wenn das der Fall ist, dann bin ich schon zurückgekehrt, und so würde es nicht an den catch . UND es hätte den falschen Wert zurückgegeben.

Muss ich noch etwas hinzufügen wie:

Codeblock 3

if($stmt->commit()){
    return true;
}

oder reicht es aus, wie ich es im Codeblock 2 geschrieben habe ?

https://src-bin.com


Answer #1

Die Ausführung wird gestoppt, wenn eine Ausnahme ausgelöst wird.

Die erste Rückgabe wird nicht erreicht, aber die Fanganweisung wird ausgeführt.

Sie können das Commit sogar direkt zurückgeben:

$dbh->beginTransaction();
try {
    // insert/update query
    return $dbh->commit();
} catch (PDOException $e) {
     $dbh->rollBack();
     return false;
}

Answer #2

Wenn Sie einen Fehler bemerken, können Sie dies tun, um alle Transaktionen wie diese zurückzusetzen

catch(Exception $e){
    $db->rollBack();
    // Failed, maybe write the error to a txt file or something
    return false;
}




transactions