Php 此代码上的事务和回滚

Php 此代码上的事务和回滚,php,mysql,Php,Mysql,下面是我在两个不同表中插入的代码。我的问题是,是否是由于坏服务器或坏连接等。插入到正在进行的第一个表,但不插入到第二个表。然后,下面的代码是否会回滚为第一个表所做的插入,如果不是,那么如何完成 注意:我的表类型在Innodb中 $mysqli->autocommit(FALSE); $stmt_one = $mysqli->prepare("Insert into TABLE SET $var1 = ?, $var2 = ? "); $stmt_two = $mysqli

下面是我在两个不同表中插入的代码。我的问题是,是否是由于坏服务器或坏连接等。插入到正在进行的第一个表,但不插入到第二个表。然后,下面的代码是否会回滚为第一个表所做的插入,如果不是,那么如何完成

注意:我的表类型在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
(“fix”)时,DB中不会有任何更改


在您的情况下(插入到2个表中):如果插入到正在进行的第一个表而不是第二个表,将调用异常
$mysqli->rollBack()。由于我们没有导致C ommit事务(由于异常),所有更改都将回滚到起始点(关闭自动提交),换句话说,我们会回滚当前事务。

OK,最后一个问题是,如果对第一个表进行插入,并且您的internet断开连接,那么您所回答的查询将起作用,这意味着回滚代码
$mysqli->rollback()不执行,那么在这种情况下,事务回滚或对第一个表的插入是否会保留在那里(在这种情况下,这是我试图避免的错误)?@user3027531 look:这不取决于您的连接。您可以在服务器上运行PHP脚本。从这一刻起,不再依赖你。如果第二次插入DB返回错误,则仅在一种情况下不能执行回滚命令-如果PHP脚本死亡(例如,服务器故障)