PHP, MySQL, PDO Transactions. Означает ли код внутри try block stop при commit ()?


Answers

Выполнение прекращается, когда генерируется исключение.

Первое возвращение не будет достигнуто, но оператор catch будет выполнен.

Вы можете даже вернуть фиксацию напрямую:

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

Я довольно новичок в транзакциях.

Раньше я занимался чем-то вроде:

Блок кода 1

$db = new PDO(...);

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

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

Но, пытаясь сгруппировать несколько запросов в одну транзакцию, я теперь использую что-то вроде:

Блок кода 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;
}

Мой вопрос: если транзакция $db->commit(); неудачно по какой-либо причине, останавливается ли код в $db->commit(); и перейти к блоку catch ? Или return true; сначала запустить, а потом попытаться пойти на catch ? Потому что, если это так, то я уже вернулся, и поэтому он не пойдет на catch . И он вернул бы неправильное значение.

Должен ли я включать что-то вроде:

Блок кода 3

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

или это достаточно, как я его написал в Code Block 2 ?