您现在的位置: 万盛学电脑网 >> 程序编程 >> 数据库 >> mysql教程 >> 正文

mysqli执行mysql事务的问题

作者:佚名    责任编辑:admin    更新时间:2022-06-22

   public static function exec_sql_tran($arr_sql){

  $result=true;

  $con = new MySQLi(DBHOST,DB_USER,DB_PASSWD,DB_NAME);

  $con->autocommit(FALSE);

  foreach($arr_sql as $key=>$sql){

  if (!$con->query($sql)) {

  echo $con->error."

  /";

  $resulf=false;

  $con->rollback();

  break;

  }

  }

  print_r($result);

  if($result){

  $con->commit();

  }

  else{

  $con->rollback();

  }

  $con->close();

  }

  $arr_sql是一个存储数据库代码的数组

  我测试的时候写了两个insert的句子,第一个句子正确,第二个句子错误,当时执行下来总是发现第一个句子执行成功。

  好像事务没用一样,php新手,求教了

  MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理

  我在mysql里面执行 show engines,看InnoDB,结果显示是支持事务的

  # Engine, Support, Comment, Transactions, XA, Savepoints

  ‘InnoDB’, ’DEFAULT’, ’Supports transactions, row-level locking, and foreign keys’, ’YES’, ’YES’, ’YES’

  $result=true;

  $resulf=false;

  看出问题了么?下面的变量名写错了

  发现了,罪过罪过~

  public static function exec_sql_tran($arr_sql){

  $result=true;

  $con = new MySQLi(DBHOST,DB_USER,DB_PASSWD,DB_NAME);

  $con->autocommit(false);

  foreach($arr_sql as $key=>$sql){

  if (!$con->query($sql)) {

  echo $con->error."

  ";

  $result=false;

  break;

  }

  }

  if($result){

  $con->commit();

  }

  else{

  $con->rollback();

  }

  $con->close();

  }

  还是问题,我改了代码之后,比如两个sql,sql1正确、sql2错误,用这个方法执行下来,sql1的数据还是正确插入数据库了

  但是如果sql1错、sql2正确的话,两个就不能插入成功,这个其实是break的作用,但是事务的作用没有体现出来啊

  public static function exec_sql_tran($arr_sql){

  $result=true;

  $con = new MySQLi(DBHOST,DB_USER,DB_PASSWD,DB_NAME);

  $con->autocommit(false);

  foreach($arr_sql as $key=>$sql){

  if (!$con->query($sql)) {

  echo $con->error."

  ";

  $result=false;

  break;

  }

  }

  if($result){

  $con->commit();

  }

  else{

  $con->rollback();

  }

  $con->close();

  }

  还是问题,我改了代码之后,比如两个sql,sql1正确、sql2错误,用这个方法执行下来,sql1的数据还是正确插入数据库了

  但是如果sql1错、sql2正确的话,两个就不能插入成功,这个其实是break的作用,但是事务的作用没有体现出来啊

  没看到事务开始的语句。

  $con->begin_transaction();

  public static function exec_sql_tran($arr_sql){

  $result=true;

  $con = new MySQLi(DBHOST,DB_USER,DB_PASSWD,DB_NAME);

  $con->autocommit(false);

  foreach($arr_sql as $key=>$sql){

  if (!$con->query($sql)) {

  echo $con->error."

  ";

  $result=false;

  break;

  }

  }

  if($result){

  $con->commit();

  }

  else{

  $con->rollback();

  }

  $con->close();

  }

  还是问题,我改了代码之后,比如两个sql,sql1正确、sql2错误,用这个方法执行下来,sql1的数据还是正确插入数据库了

  但是如果sql1错、sql2正确的话,两个就不能插入成功,这个其实是break的作用,但是事务的作用没有体现出来啊

  没看到事务开始的语句。

  $con->begin_transaction();

  mysqli里面我没有找到begin_transaction()这个方法。。。

  http://www.php.net/manual/zh/mysqli.begin-transaction.php

  这个是什么?

  这个我看到了

  (PHP 5 >= 5.5.0)

  mysqli::begin_transaction – mysqli_begin_transaction — Starts a transaction

  是不是php版本要大于5.5.0才有事务的?

  http://www.php.net/manual/zh/mysqli.begin-transaction.php

  这个是什么?

  我在代码里面调用这个方法是显示未定义的

  看看表的引擎吧,我怀疑不是INNODB的

  看看表的引擎吧,我怀疑不是INNODB的

  我确定数据库的引擎是INNODB,表的怎么看~?

  看看表的引擎吧,我怀疑不是INNODB的

  搞定了,就是表的引擎没有变过来