PHP,MySQL,PDO事务 - try块中的代码是否在commit()处停止?

时间:2016-05-20 08:13:39

标签: php mysql pdo transactions

我对交易很陌生。

之前,我在做的事情是这样的:

代码块

$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();并跳转到catch块?或者return true;首先运行,然后它会尝试转到catch? '因为如果是这样,那么我已经回来了,所以它不会去catch。它会返回错误的值。

我还需要包含以下内容:

代码块

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

或者我在代码块2

中写的方式是否足够?

3 个答案:

答案 0 :(得分:3)

如果事务因任何原因失败,代码会在发生错误的行停止结束,然后执行直接跳转到catch块。因此,在代码块2中编写代码就足够了。

请注意,您应该在回滚后始终重新抛出异常。否则您永远不会知道什么是问题。所以它应该是

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){
    $db->rollBack();
    throw $e;
}

答案 1 :(得分:1)

抛出异常时停止执行。

将不会达到第一次返回,但会执行catch语句。

您甚至可以直接返回提交:

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

答案 2 :(得分:0)

如果您遇到任何错误,可以执行此操作以回滚所有此类交易

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