【问题标题】:What kind of codes can be into PDO transactions?什么样的代码可以进入 PDO 交易?
【发布时间】:2016-05-15 14:49:45
【问题描述】:

这是我的脚本:

$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();
}

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

$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() 过早关闭事务。

【问题讨论】:

  • 再次阅读那里的评论。他说,嵌套事务而你只有一个。
  • @Chay22 我读了好几遍了。问题是我的英语不好。。还是谢谢你。
  • 哈,我们也有同样的问题。

标签: php mysql pdo


【解决方案1】:

您的交易结构没有问题。 php.net 上的评论仅意味着 MySQL 不支持 nested 事务。为了您的进一步问题,您可以查询任何数据 (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 语句或其同义词之一时对任何当前事务执行的隐式提交的结果。

【讨论】:

  • 必须补充一点,事务中只允许查询数据。 DDL 查询,例如 alter table 将在 MySQL 执行之前导致提交打开的事务。
  • 所有insertupdateselectdelete都可以吗?
  • 是的,一般情况下它们应该包括函数调用和触发器。代码可能会破坏事物的地方。我已经修复了 MySQL ref 的 URL。详情请参阅。
【解决方案2】:

你可以在一个事务中做任何事情,你唯一不能做的就是嵌套事务。

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

【讨论】:

  • 所以我的第二个代码(包括if 语句)没问题?
猜你喜欢
  • 2011-01-17
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 2018-02-10
相关资源
最近更新 更多