【问题标题】:PDO transactions with InnoDB tables带有 InnoDB 表的 PDO 事务
【发布时间】:2011-10-04 14:25:38
【问题描述】:

我有我们通过 PHP 的 PDO API 访问的 InnoDB 表。现在,我已经阅读了 INSERT 和 UPDATE 语句,使用 InnoDB 事务可能是一个好主意。由于自动提交设置为 1,它会在查询完成后立即提交。因此,如果我将一堆 INSERT 组合在一起并执行以下操作:

$GLOBALS['dbh']->query('BEGIN');
[multiple INSERT queries here]
$GLOBALS['dbh']->query('COMMIT');

它应该更有效率。

问题:

  1. 这是正确的吗?
  2. 我还读到某些 API 使用自己的事务,我想知道是否有人知道 PDO 是否这样做。换句话说,我应该完全担心这样做还是让 PDO 处理事务?
  3. 如果 PDO 确实处理事务,我是否将上述查询搞砸了?

谢谢。

【问题讨论】:

    标签: mysql pdo innodb


    【解决方案1】:

    这对吗?

    是的。
    小挑剔:我会用START TRANSACTION而不是begin,它是一样的,但更不言而喻。

    我还读到某些 API 使用自己的事务,我想知道是否有人知道 PDO 是否这样做。换句话说,我应该担心这样做还是让 PDO 处理事务?

    PDO 不会神奇地知道事务何时开始和结束,因此如果 auto-commit =1 并且您希望在事务中包含多于 1 条语句,您仍然必须开始和结束事务。
    你不用担心,你在上面做的很好。

    如果 PDO 确实处理事务,我是不是把上面的查询搞砸了?

    没有。

    因此,如果我将一堆 INSERT 组合在一起并执行以下操作:{请参阅上面的代码} 应该会更有效率。

    不是很多,如果您可以将所有插入内容压缩到一个语句中会更有效。
    如果你可以用load data infile 替换插入,那效率会更高。

    示例:

    INSERT INTO table1 (field1, field2) VALUES (1,1),(2,5),(5,6);
    -- Much more efficient than 3 separate inserts 
    -- (and you don't need to start and end the transaction :-)
    

    【讨论】:

    • 感谢您的回复。但我听到你说的是,上面的内容并没有真正的帮助,如果我离开它而没有 BEGIN 和 COMMIT ,它几乎是一样的?我的查询是单独的INSERT INTO,因为它们包含在 IF 语句中,所以我不能将它们捆绑在一起。真的,BEGIN 和 COMMIT 根本没有帮助吗?
    • @kakubei,你从哪里得到那个的想法,start transactioncommit 非常有用,只是效率不是很高。
    • 好的,现在我很困惑。 BEGIN 和 COMMIT 在这种情况下有什么用处?使用它们比让自动提交做它的事情更好吗?如果是,为什么?
    • 我真的错过了一些东西,因为那个 wiki 页面根本没有回答我的问题。它没有提到在 BEGIN 和 COMMIT 之间使用自动提交或将 3 个插入捆绑在一起是否更好。我真的希望知道交易的人可以回答这个问题。
    • @kakubei,显然你必须从不使用自动提交。但是做显式事务并将属于一起的事物放在一个事务中。 “在 BEGIN 和 COMMIT 之间将 3 个插入串在一起。我是”是正确答案。
    【解决方案2】:

    理论上是正确的,但“官方”的做法是使用 PDO 的内置方法:http://www.php.net/manual/en/pdo.begintransaction.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多