PDO多个查询:提交和回滚事务

Cha*_*kar 0 php mysql pdo commit rollback

我需要触发2个查询。目前,我正在这样做:

// Begin Transaction
$this->db->beginTransaction();

// Fire Queries
if($query_one->execute()){
    if($query_two->execute()){

        // Commit only when both queries executed successfully
        $this->db->commit();

   }else{
        $this->db->rollback();
   }
}else{
    $this->db->rollback();
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?我在代码中没有使用try..catch,这会使我的代码在任何情况下都不适当或容易受到攻击吗?

vhu*_*vhu 6

是的,您的方法是正确的。Try...catch在某些情况下,使用代码可能会使代码更清晰,可读性更好,但您的总体方法很好。

如果您的代码片段来自于处理数据库查询的函数,而其他则不多,那么我可能会改变方法:

// Begin Transaction
$this->db->beginTransaction();

// Fire Queries
if(!$query_one->execute()){
    $this->db->rollback();
    // other clean-up goes here
    return;
}

if(!$query_two->execute()){
    $this->db->rollback();
    // other clean-up goes here
    return; 
}

$this->db->commit();
Run Code Online (Sandbox Code Playgroud)

当然,如果您需要先进行大量清理return,那么原始方法会更好。特别是在这些情况下,我会考虑使用PDO :: ERRMODE_EXCEPTION。这还有一些其他好处,例如,除非被捕获,否则异常会自动回滚事务。


And*_*ian 5

您需要将交易包装在 try-catch 中。大多数情况下,如果抛出异常,则说明您的流程无法继续。你不知道异常会从哪里来,对吧?因此,与其让异常疯狂抛出并强制应用程序停止,不如捕获它,回滚数据库事务,然后重新抛出它。

// Begin Transaction
$this->db->beginTransaction();

try {

    $queryOne->execute();
    $queryTwo->execute();

    $this->db->commit();

} catch (\Exception $e) {
    $this->db->rollback();
    throw $e;
}
Run Code Online (Sandbox Code Playgroud)