对具有相关结果的查询使用事务

时间:2016-07-14 02:48:34

标签: php mysql pdo transactions

这是我的脚本结构:

try {
    $dbh_conn->beginTransaction();

    $stmt1 = $dbh_conn->prepare("SELECT user_id FROM activate_account WHERE token = ?");
    $stmt1->execute(array($validate_activate_token));
    $num_rows = $stmt1->fetch(PDO::FETCH_ASSOC);

    if($num_rows) {

        $user_id = $num_rows['user_id'];

        $stmt2 = $dbh_conn->prepare("UPDATE users SET active = 1 WHERE id = ?");
        $stmt2->execute(array($user_id));
        $updated = $stmt2->rowCount();

        if ( $updated > 0 ){

            $stmt3 = $dbh_conn->prepare("DELETE FROM activate_account WHERE token = ?");
            $stmt3->execute(array($validate_activate_token));

            $status = "all fine";

        } else {

            $status = "first problem";
        }

    } else {

        $status = "second problem";
    }

    $dbh_conn->commit();
    echo $status;
    die;

} catch(PDOException $e) {

    $dbh_conn->rollBack();

    $status = "third problem";
    echo $status;
    die;
}

我的代码总是的结果是second problem。为什么?我怎样才能重写我的代码来修复它?

请注意,我已经单独测试了这个条件if($num_rows) { (单独在另一个脚本中),它是 true ,但是当我把它写入上面的脚本时,它始终是 false

1 个答案:

答案 0 :(得分:0)

交易的目的是确保必须一起发生的查询永远不会被打破。在您的用例中,第一个查询可以独立执行,没有任何缺点。

将最后两个放在一个交易中,但保留第一个。如果第一个失败,就不要运行其他两个。

如果第一个成功,但另外两个中的一个(在事务中)失败,以致两者都没有被提交,那么执行第一个就不会更糟。