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

时间:2014-04-06 06:32:36

标签: 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();
}

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

2 个答案:

答案 0 :(得分:5)

是的,您的方法是正确的。在某些情况下,使用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();

当然,如果您需要在return之前完成大量清理工作,那么您的原始方法会更好。特别是在这些情况下,我会研究使用PDO :: ERRMODE_EXCEPTION。这有一些额外的好处,例如异常会自动回滚事务,除非它们被捕获。

答案 1 :(得分:4)

您需要将您的交易包装在try-catch中。大多数情况下,如果抛出异常,那么您的流程无法继续存在错误。你不知道异常的来源,对吧?因此,不要让异常抛出异常并强制应用程序停止,最好抓住它,回滚数据库事务,然后重新抛出它。

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

try {

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

    $this->db->commit();

} catch (\Exception $e) {
    $this->db->rollback();
    throw $e;
}