Php 此代码上的事务和回滚
下面是我在两个不同表中插入的代码。我的问题是,是否是由于坏服务器或坏连接等。插入到正在进行的第一个表,但不插入到第二个表。然后,下面的代码是否会回滚为第一个表所做的插入,如果不是,那么如何完成 注意:我的表类型在Innodb中Php 此代码上的事务和回滚,php,mysql,Php,Mysql,下面是我在两个不同表中插入的代码。我的问题是,是否是由于坏服务器或坏连接等。插入到正在进行的第一个表,但不插入到第二个表。然后,下面的代码是否会回滚为第一个表所做的插入,如果不是,那么如何完成 注意:我的表类型在Innodb中 $mysqli->autocommit(FALSE); $stmt_one = $mysqli->prepare("Insert into TABLE SET $var1 = ?, $var2 = ? "); $stmt_two = $mysqli
$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
(“fix”)时,DB中不会有任何更改
在您的情况下(插入到2个表中):如果插入到正在进行的第一个表而不是第二个表,将调用异常$mysqli->rollBack()代码>。由于我们没有导致C ommit事务(由于异常),所有更改都将回滚到起始点(关闭自动提交),换句话说,我们会回滚当前事务。OK,最后一个问题是,如果对第一个表进行插入,并且您的internet断开连接,那么您所回答的查询将起作用,这意味着回滚代码$mysqli->rollback()代码>不执行,那么在这种情况下,事务回滚或对第一个表的插入是否会保留在那里(在这种情况下,这是我试图避免的错误)?@user3027531 look:这不取决于您的连接。您可以在服务器上运行PHP脚本。从这一刻起,不再依赖你。如果第二次插入DB返回错误,则仅在一种情况下不能执行回滚命令-如果PHP脚本死亡(例如,服务器故障)