此代码的事务和回滚

时间:2014-01-19 18:58:10

标签: 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();

1 个答案:

答案 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事务(由于异常),所有更改都将回滚到起点(关闭自动提交),换句话说,我们会回滚当前事务。