以下是我的代码,我在其中插入两个不同的表。我的问题是是否由于服务器故障或连接不良等原因。正在对第一个表进行插入,但不会对第二个表进行插入。那么以下代码是否会回滚对第一个表所做的插入,如果不是,那么如何完成?
注意:我在 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();
最佳答案
看:
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);
来完成。这意味着所有查询更改数据库必须“修复”才能“完成”事务。它是通过$mysqli->commit();
完成的。当您不调用commit
(“修复”)时,数据库中不会发生任何更改。
在您的情况下(插入到 2 个表中):如果插入到第一个表而不是第二个表,将通过 $mysqli->rollBack();
调用异常。由于我们没有引起 сcommit 事务(由于异常),所以所有更改都会回滚到起始点(关闭自动提交),换句话说,我们回滚当前事务。
关于php - 这段代码的事务和回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21221148/