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


1 Answers

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

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

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

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

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

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

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



Related