加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP mysql与mysqli事务使用介绍

发布时间:2022-07-05 15:51:10 所属栏目:PHP教程 来源:互联网
导读:首先,mysqli 连接是永久连接,而mysql是非永久连接,什么意思呢?mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力. mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很
  首先,mysqli 连接是永久连接,而mysql是非永久连接,什么意思呢?mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力.
 
  mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法,应用比较多的地方是 mysqli的事务,比如下面的示例,代码如下:
 
  $mysqli = new mysqli('localhost','root','','DB_Lib2Test');
  $mysqli->autocommit(false);//开始事物
  $mysqli->query($sql1);
   $mysqli->query($sql2);
  if (!$mysqli->errno) {
   $mysqli->commit();
   echo 'ok';
  } else {
   echo 'err';
   $mysqli->rollback();
  }
  在这里,我们再使用 php mysql 系列函数执行事务,代码如下:
 
  $sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
  $sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'";
  $sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)";
   
  $conn = mysql_connect('localhost','root','');
  mysql_select_db('DB_Lib2Test');
  mysql_query('start transaction');
  //mysql_query('SET autocommit=0');
   
  mysql_query($sql1);
 
  还有一点要注意:MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务.
 
  但往往,我们需要在使用事务的时候,是需要执行多条sql语句的,这就需要我们手动设置MySQL的autocommit属性为0,默认为1.
 
  同时,使用START TRANSACTION语句显式的打开一个事务,如上面的示例,如果不这样做,会有什么结果呢?
 
  我们将上面第二段代码中 //mysql_query(‘SET autocommit=0′); 和 // mysql_query($sql3); 注释去掉,然后执行.
 
  此时,mysql_query($sql3) 执行就不会insert到数据库中,如果我们将 // mysql_query(‘SET autocommit=1′); 本句注释去掉,那么mysql_query($sql3); 就会执行成功.
 
  通常COMMIT或ROLLBACK语句执行时才完成一个事务,但是有些DDL语句等会隐式触发COMMIT.
 
  比如下列语句:
 
  ALTER FUNCTION
 ATA
  LOCK TABLES
  RENAME TABLE
  TRUNCATE TABLE
  SET AUTOCOMMIT=1
  START TRANSACTION
  我们再来举个例子看下,代码如下:
 
  $sql1 = 'create table ScoreDetail_new(id int)';
  $sql2 = 'rename table ScoreDetail to ScoreDetail_bak';
  $sql3  = 'rename table ScoreDetail_new to ScoreDetail';
   
  $mysqli = new mysqli('localhost','root','','DB_Lib2Test');
    echo 'ok';
  } else {
   echo 'err';
   $mysqli->rollback();
  }
  上面的示例中,假如$sql2执行出错了,$sql1照样会执行的,为什么呢?因为rename在执行的时候,mysql默认会先执行commit,再执行rename.
 
  注意:MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理,其他的类型是不支持的.一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务!如果要让MYSQL支持事务,可以自己手动修改:
 
  方法如下:1.修改c:/appserv/mysql/my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件.
 
  2.在运行中输入:services.msc,重启mysql服务。
 
  3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了.
 
  也就说明支持事务transaction了.

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读