什么样的代码可以进入PDO交易?

时间:2016-05-15 14:49:46

标签: php mysql pdo

这是我的剧本:

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

// database connection here

try{
    $db_conn->beginTransaction();
    // inserting
    $stm1 = $db_conn->prepare("INSERT into table1 (col) VALUES (?)");
    $stm1->execute(array($value));

    // updating
    $stm2 = $db_conn->prepare("UPDATE table2 SET col = "a new row inserted" WHERE id = ?");
    $stm2->execute(array($id));

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

我想知道的是,我可以在ifbeginTransaction()之间的代码中使用commit()语句吗?像这样:

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

// database connection here

try{
    $db_conn->beginTransaction();
    // inserting
    $stm1 = $db_conn->prepare("INSERT into table1 (col) VALUES (?)");
    $stm1->execute(array($value));

    // updating
    if (/* a condition here */){
        $stm2 = $db_conn->prepare("UPDATE table2 SET col = "a new row inserted" WHERE id = ?");
        $stm2->execute(array($id));
    }

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

可以吗?

其实我问过这个问题,因为here是一句话,说你做不到,这样做很危险:

  

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

2 个答案:

答案 0 :(得分:2)

您的交易结构没有问题。对php.net的评论仅表示MySQL不支持嵌套事务。为了您的进一步问题,您可以查询任何数据(SQL),操纵数据(DML),但修改任何数据库结构(DDL - 数据定义语言)。

/*won't work*/
START TRANSACTION;
/*statement*/
START TRANSACTION; /*nested not supported, auto commit*/
/*statement*/
COMMIT;
/*statement dependend on 1st transaction won't work*/
COMMIT;

另见MySQL ref

  

无法嵌套交易。这是当您发出START TRANSACTION语句或其中一个同义词时对任何当前事务执行的隐式提交的结果。

答案 1 :(得分:1)

您可以在事务中执行所有操作,唯一不能做的就是嵌套事务。

if子句本身不是链接评论中的问题,但事实上内部还有另一个beginTransaction / commit对。