萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysqli執行mysql事務的問題

mysqli執行mysql事務的問題

   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的

  搞定了,就是表的引擎沒有變過來

copyright © 萬盛學電腦網 all rights reserved