【问题标题】:php mysqli - burying transactions in a single queryphp mysqli - 将事务隐藏在单个查询中
【发布时间】:2013-11-13 13:32:06
【问题描述】:

MySQli 一直说我的“组合”查询的第一个选择部分存在语法错误,如下所示:

$my_massive_query =
    'START TRANSACTION WITH CONSISTENT SNAPSHOT;
    SELECT d.id AS `Location ID`, ...
    SELECT d.id AS `Location ID`, ...
    SELECT d.id AS `Location ID`, ...
    SELECT d.id AS `Location ID`, ...
    SELECT d.id AS `Location ID`, ...
    COMMIT';
$mysqli->query($my_massive_query);

这在 php 中是“不允许的”吗?是否必须使用以下mysqli函数:

$mysqli->autocommit(FALSE);
$mysqli->query("SELECT ...");
$mysqli->query("SELECT ...");
$mysqli->query("SELECT ...");
$mysqli->commit();

我已经在 mysql 中执行了查询(在使用 var_dump 按原样获取它之后),并且它执行得很好,所以我不认为确实存在语法问题,并且可能不允许“组合”在单个字符串中查询?

我担心START TRANSACTION WITH CONSISTENT SNAPSHOT; 有一些额外的条件,仅将 autocommit 设置为 false 将无法满足这些条件。

【问题讨论】:

  • This 可能会有所帮助。

标签: php transactions mysqli autocommit


【解决方案1】:

mysqli::query 一次只能处理 1 个查询。要在一个字符串中执行多个查询,请使用mysqli::multi_query

【讨论】:

  • 我将其标记为另一个答案,尽管两者都很棒,原因很简单,您确认:“mysqli::query 一次只能处理 1 个查询。”跨度>
【解决方案2】:

使用 API 函数,您可以在控制台中执行所有操作
但是,每个命令都必须单独调用。这是非常简单的规则

$mysqli->query("START TRANSACTION WITH CONSISTENT SNAPSHOT");
$mysqli->query("SELECT ...");
$mysqli->query("SELECT ...");
$mysqli->query("COMMIT");

【讨论】:

  • 总是快速投反对票不是吗.. 如果您的意见附有解释,您实际上会更有帮助..
  • 感谢您的回答。只是对此的快速补充:这似乎比使用 mysqli::multi_query 慢很多(至少对我而言)。此外,使用它,必须记住从每个查询中获取结果,例如$result = $mysqli->query("SELECT ...");但这比使用替代方法所需的 mysqli_next_result 和 mysqli_store_result 更简单
  • 不能再慢了。仅当您在没有得到结果的情况下测量多查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2013-09-23
  • 2015-05-05
  • 2010-10-20
相关资源
最近更新 更多