【问题标题】:Mysqli::commit() returns false, but no error messageMysqli::commit() 返回 false,但没有错误信息
【发布时间】:2014-03-12 05:01:10
【问题描述】:

我在 try/catch 块中有三个 sql 查询。自动提交已关闭,所有三个查询都运行没有错误,我已经验证了(如果任何查询失败,它不应该到达提交行,但我已经通过 xdebug 验证了它,一次单步执行代码)。当代码到达 commit() 函数调用时,mysqli 返回 false,但没有错误消息。当之前的查询都有效时,提交怎么会失败?

这基本上是代码的样子:

try{
    $mysqli->autocommit(false);

    $sql1 = "insert into...";
    $mysqli->query($sql); // Works!
    if($mysqli->error)
    {
        $mysqli->rollback();
        throw new Exception....
    }


    $sql2 = "insert into...";
    $mysqli->query($sql); // Works!
    if($mysqli->error)
    {
        $mysqli->rollback();
        throw new Exception....
    }


    $mysqli->commit(); // Fail

}

【问题讨论】:

  • 而且受影响的表的存储类型是innoDB吧?
  • $mysqli->autocommit(false) 成功了吗?尝试提交后$mysqli->error 是什么?
  • 表是innoDB,是的。自动提交有效。 $mysqli-error 为空,没有错误信息,没有错误代码,什么都没有。

标签: php sql mysqli commit


【解决方案1】:

检查是否有: $mysqli->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);(当然如果你想写/插入表格)

尝试按照以下步骤进行调试: [ -- 开始交易代码 --]

$q2=$mysqli->query($query2);//查询内部事务

打印'q2:'.$mysqli->错误;

[ -- 提交/回滚条件/代码--------]

您可能会收到此错误: “无法在只读事务中执行语句。” -> 将开始事务的参数更改为 MYSQLI_TRANS_START_READ_WRITE

还要检查是否为要使用事务的表设置了 innoDB 引擎。

您还可以在事务块之外测试查询,以确保它们没有错误。

【讨论】:

    猜你喜欢
    • 2015-06-27
    • 2015-08-02
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多