以下是我的代码,我在其中插入两个不同的表。我的问题是由于服务器坏或连接不良等原因造成的。插入第一个表但不插入第二个表。然后,下面的代码将回滚第一个表的插入,如果没有,那么如何做?
注意:我的表格类型为Innodb
$mysqli->autocommit(FALSE);
$stmt_one = $mysqli->prepare("Insert into TABLE SET $var1 = ?, $var2 = ? ");
$stmt_two = $mysqli->prepare("Insert into TABLE SET $var1 = ?, $var2 = ? ");
$stmt_one->bind_param('is',$var1,$var2);
$stmt_two->bind_param('is',$var1,$var2);
$stmt_one->execute();
$stmt_two->execute();
$mysqli->commit();
$stmt_one->close();
$stmt_two->close();
答案 0 :(得分:1)
看看:
try {
$mysqli->autocommit(FALSE);
$stmt_one = $mysqli->prepare("Insert into TABLE SET $var1 = ?, $var2 = ? ");
$stmt_two = $mysqli->prepare("Insert into TABLE SET $var1 = ?, $var2 = ? ");
$stmt_one->bind_param('is',$var1,$var2);
$stmt_two->bind_param('is',$var1,$var2);
$stmt_one->execute();
$stmt_two->execute();
$mysqli->commit();
$stmt_one->close();
$stmt_two->close();
} catch (Exception $e) {
$mysqli->rollBack();
echo "Fallo: " . $e->getMessage();
}
要启动事务,您需要关闭自动提交数据库修改。你可以通过$mysqli->autocommit(FALSE);
来完成。这意味着所有查询 - 更改DB必须为“完成”事务“固定”。它通过$mysqli->commit();
进行。虽然您没有调用commit
(“修复”) - 但DB中没有任何更改。
在您的情况下(插入2个表):如果插入到第一个表而不是第二个表,将使用$mysqli->rollBack();
调用异常。由于我们没有引起сommit事务(由于异常),所有更改都将回滚到起点(关闭自动提交),换句话说,我们会回滚当前事务。