我在try / catch块中有三个sql查询。 Autocommit是关闭的,所有三个查询都运行没有错误,我已经验证了(如果任何查询失败,它不应该到达提交行,但我已经通过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
}
答案 0 :(得分:0)
检查:
$mysqli->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
(当然,如果你想在表中编写/插入)
尝试按照以下步骤进行调试: [ - 启动交易代码 - ]
$ q2 = $ mysqli-> query($ query2); //查询内部交易
print' q2:'。$ mysqli->错误;
[ - commit / rollback condition / code --------]
您可能会收到此错误消息: "无法在READ ONLY事务中执行语句。" - > 将begin transaction的参数更改为MYSQLI_TRANS_START_READ_WRITE
还要检查是否为要使用事务的表设置了innoDB引擎。
您还可以在事务块之外测试查询,以确保它们没有错误。