【问题标题】:PDO Multiple queries: commit and rollback transactionPDO 多个查询:提交和回滚事务
【发布时间】:2014-05-18 10:02:00
【问题描述】:

我需要触发 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 是否会使我的代码在任何情况下都不合适或易受攻击?

【问题讨论】:

    标签: php mysql pdo commit rollback


    【解决方案1】:

    是的,您的方法是正确的。在某些情况下,使用 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。这有一些额外的好处,比如异常会自动回滚事务,除非它们被捕获。

    【讨论】:

      【解决方案2】:

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

      // Begin Transaction
      $this->db->beginTransaction();
      
      try {
      
          $queryOne->execute();
          $queryTwo->execute();
      
          $this->db->commit();
      
      } catch (\Exception $e) {
          $this->db->rollback();
          throw $e;
      }
      

      【讨论】:

      • 需要吗?怎么样更好?
      • @YourCommonSense 我编辑了我的答案以提供更详细的解释。
      • 仍然没有让他的代码变得更好。为了方便,一个人可以使用事务,但这不是必需的。可以检查具有完全相同结果的执行结果。异常不垄断检查查询结果。 OP基本上问他是否可以没有它们。因此,这个答案对给出的问题具有误导性。
      • @YourCommonSense 我不同意,安迪的回答对我来说更有意义。如果您有 10 个查询怎么办?放弃那些 ifs 并进行事务处理,Andy 的成语对此很有用。当您说“异常不会垄断检查查询结果”时,您是对的,它们只是更安全(即使从开发视角来看,也不会出现异常通过这样的习惯用法,而如果您重构某些代码并忘记了 if-否则...繁荣:))。赞成
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 2013-11-22
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多