php - 这段代码的事务和回滚

标签 php mysql

以下是我的代码,我在其中插入两个不同的表。我的问题是是否由于服务器故障或连接不良等原因。正在对第一个表进行插入,但不会对第二个表进行插入。那么以下代码是否会回滚对第一个表所做的插入,如果不是,那么如何完成?

注意:我在 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/

相关文章:

php - 从像素数组创建图像服务器端

php - 使用 UNION JOIN 从多个用户类型中选择项目

php - 我可以防止 PDO 中的长查询吗?

php - MySQL 转储不工作

mysql - 连续日期的计数总和

ios - 如何在 parse.com 中将一列拆分为多个变量列

javascript - php mysql数据表在同一页面保存和编辑

php - Paypal 拒绝网站教程中示例代码的凭据

php - 没有数据库的 Codeigniter 网站在实时服务器上生成数据库错误

java - 如何使用mysql查询处理空数据库