Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO多查询:提交和回滚事务_Php_Mysql_Pdo_Commit_Rollback - Fatal编程技术网

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

Php PDO多查询:提交和回滚事务,php,mysql,pdo,commit,rollback,Php,Mysql,Pdo,Commit,Rollback,我需要提出两个问题。目前我是这样做的: // Begin Transaction $this->db->beginTransaction(); // Fire Queries if($query_one->execute()){ if($query_two->execute()){ // Commit only when both queries executed successfully $this->db->co

我需要提出两个问题。目前我是这样做的:

// 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,这会使我的代码在任何情况下都不合适或易受攻击吗?

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

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

try {

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

    $this->db->commit();

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

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

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

try {

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

    $this->db->commit();

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

是的,你的方法是正确的。在某些情况下,使用
Try…catch
可能会生成更干净、可读性更强的代码,但您的总体方法是不错的

如果您的代码片段来自处理DB查询的函数,而不是其他函数,我可能会改变这种方法:

// 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();

当然,如果在返回
之前需要进行大量清理,那么您原来的方法会更好。特别是在这些情况下,我将研究如何使用PDO::ERRMODE_异常。这还有一些额外的好处,比如异常自动回滚事务,除非它们被捕获。

是的,您的方法是正确的。在某些情况下,使用
Try…catch
可能会生成更干净、可读性更强的代码,但您的总体方法是不错的

如果您的代码片段来自处理DB查询的函数,而不是其他函数,我可能会改变这种方法:

// 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();

当然,如果在返回
之前需要进行大量清理,那么您原来的方法会更好。特别是在这些情况下,我将研究如何使用PDO::ERRMODE_异常。这还有一些额外的好处,比如异常自动回滚事务,除非它们被捕获。

需要吗?“怎么会更好?”YourCommonSense我编辑了我的答案,给出了更详细的解释。但这并没有让他的代码变得更好。为了方便起见,可以使用事务,但这不是必需的。可以使用完全相同的结果检查执行结果。异常不会独占检查查询结果。而OP基本上是问他是否可以不带他们继续生活。所以,这个答案对于给出的问题来说是误导性的。@YourCommonSense我不同意,安迪的答案对我来说更有意义。如果你有10个问题呢?放下那些“如果”去做交易吧,安迪的成语很好。当你说“异常不会垄断检查查询结果”时,你是对的,它们只是更安全(即使是从开发人员的角度来看,也没有异常会越过这样的习惯用法,而如果你重构一些代码而忘记了if-else…boom:))。你需要什么?“怎么会更好?”YourCommonSense我编辑了我的答案,给出了更详细的解释。但这并没有让他的代码变得更好。为了方便起见,可以使用事务,但这不是必需的。可以使用完全相同的结果检查执行结果。异常不会独占检查查询结果。而OP基本上是问他是否可以不带他们继续生活。所以,这个答案对于给出的问题来说是误导性的。@YourCommonSense我不同意,安迪的答案对我来说更有意义。如果你有10个问题呢?放下那些“如果”去做交易吧,安迪的成语很好。当你说“异常不会垄断检查查询结果”时,你是对的,它们只是更安全(即使是从开发人员的角度来看,也没有异常会越过这样的习惯用法,而如果你重构一些代码而忘记了if-else…boom:))。向上投票