我可以在PDO事务中使用try catch异常吗?

时间:2016-05-16 07:06:54

标签: php mysql pdo

这是我的剧本:

$id    = $_GET['id'];
$value = $_GET['val'];

// database connection here

try{
    $db_conn->beginTransaction();                               // this

    $stm1 = $db_conn->prepare("UPDATE table1 SET col = "updated" WHERE id = ?");
    $stm1->execute(array($value));
    $done = $stm->rowCount();

    if ($done){
        try {
            $stm2 = $db_conn->prepare("INSERT into table2 (col) VALUES (?)");
            $stm2->execute(array($id));

        } catch(PDOException $e){
            if ((int) $e->getCode() === 23000) {  // row is duplicate
                $stm3 = $db_conn->prepare("DELETE FROM table2 WHERE col = ?");
                $stm3->execute(array($id));
            }
        }

    } else {
        $error = true;
    }

    $db_conn->commit();                                          // this
}
catch(PDOException $e){
    $db_conn->rollBack();
}

首先,我必须说,我的脚本有效。我的意思是结果或它在测试中是预期的。只有一件事吓到我了。我阅读了文件并看到了这句话:

  

无法工作且危险,因为您可以使用嵌套的commit()过早关闭事务。

我不确定上面句子的含义是什么,我理解也许我不应该在try - catchbeginTransaction()之间使用嵌套commit()。好吧,我说得对吗?这样做很危险吗?

1 个答案:

答案 0 :(得分:2)

例外与交易没有直接关系。您可以根据需要在代码中添加任意数量的catch块。

所以你的代码没问题,因为你已经将PDO错误报告设置为例外。