【问题标题】:PDO bug: prepare() with multi-queries doesn't work inside a transactionPDO 错误:带有多查询的 prepare() 在事务中不起作用
【发布时间】:2012-03-25 18:31:15
【问题描述】:

在寻找我上一个问题的解决方案时,我遇到了一个奇怪的事实 - 带有多查询的 PDO prepare() 在事务中无法正常工作。你没有收到任何警告,没有例外,什么都没有——只是沉默,没有提交/回滚。

此外,即使除了第一个查询之外的某些查询包含错误,您也不会出现异常。虽然如果第一个查询包含错误,您会得到预期的异常。

如果没有交易,一切正常。

如果您将多个 prepare() 语句(每个语句都有一个查询)放在一个事务中 - 再次,一切正常。

我读到 MySQL 不支持多查询的预处理语句,但问题是 PDO 默认情况下不处理真正的 MySQL 预处理语句,只模拟它们。

我花了一整天的时间试图找到一些描述这个问题的文档,但我失败了。

有人知道这是否真的是一个 PDO 错误吗?

【问题讨论】:

  • “PDO 默认不处理真正的 MySQL 预处理语句,只模拟它们” - 不,PDO abstracts 参数处理成通用语法.底层数据库引擎(无论是 MySQL 还是任何其他引擎)仍必须支持您尝试使用的功能。
  • @Tomalak:实际上 OP 是正确的 - PDO 模拟prepared。 “底层数据库引擎必须仍然支持您尝试使用的功能”——它会改变什么?
  • 感谢您的评论。可能是我使用的术语不正确,但问题仍然存在 - 带有多查询的 prepare() 在事务中不起作用。并且在不在事务中时工作。
  • 是的,没关系。这太挑剔了。

标签: php transactions pdo


【解决方案1】:

这种行为实际上是某些版本的错误(在 PHP 5.4.6-Ubuntu 和 PHP 5.4.19-Windows 上测试)。

没有(容易找到)关于这个问题的文档,唯一的解决方法是使用多个准备好的语句。

刚刚报告了错误https://bugs.php.net/bug.php?id=65994

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 1970-01-01
    • 2015-05-25
    • 2014-12-09
    • 2022-01-22
    • 2014-09-19
    • 1970-01-01
    • 2014-01-31
    • 2019-05-22
    相关资源
    最近更新 更多