网站地图    收藏   

主页 > php专栏 > php应用 >

PHP mysql与mysqli事务使用说明 - php高级应用

来源:自学PHP网    时间:2014-11-27 22:16 作者: 阅读:

[导读] 首先,mysqli 连接是永久连接,而mysql是非永久连接,什么意思呢?mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压...

PHP mysql与mysqli事务使用说明

首先,mysqli 连接是永久连接,而mysql是非永久连接,什么意思呢?mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力.

mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法,应用比较多的地方是 mysqli的事务,比如下面的示例,代码如下:

  1. $mysqli = new mysqli('localhost','root','','DB_Lib2Test'); 
  2. $mysqli->autocommit(false);//开始事物 
  3. $mysqli->query($sql1); 
  4. $mysqli->query($sql2); 
  5. if(!$mysqli->errno){ 
  6.   $mysqli->commit(); 
  7.   echo 'ok'
  8. }else
  9.  echo 'err'
  10.   $mysqli->rollback(); 

在PHP中,mysqli 已经很好的封装了mysql事务的相关操作,如下示例:

  1. $sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'"
  2. $sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'"
  3. $sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)"
  4.  
  5. $mysqli = new mysqli('localhost','root','','DB_Lib2Test'); 
  6. $mysqli->autocommit(false); // 开始事务 
  7. $mysqli->query($sql1); 
  8. //开源代码phpfensi.com 
  9. $mysqli->query($sql2); 
  10. if (!$mysqli->errno) { 
  11.  $mysqli->commit(); 
  12.  echo 'ok'
  13. else { 
  14.  echo 'err'
  15.  $mysqli->rollback(); 

在这里,我们再使用 php mysql 系列函数执行事务,代码如下:

  1. $sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'"
  2. $sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'"
  3. $sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)"
  4.  
  5. $conn = mysql_connect('localhost','root',''); 
  6. mysql_select_db('DB_Lib2Test'); 
  7. mysql_query('start transaction'); 
  8. //mysql_query('SET autocommit=0'); 
  9.  
  10. mysql_query($sql1); 
  11. mysql_query($sql2); 
  12. if (mysql_errno()) { 
  13.  mysql_query('rollback'); 
  14.  echo 'err'
  15. else { 
  16.  mysql_query('commit'); 
  17.  echo 'ok'
  18.  
  19. // mysql_query('SET autocommit=1'); 
  20. // mysql_query($sql3); 

在这里要注意.

MyISAM:不支持事务,用于只读程序提高性能 

InnoDB:支持ACID事务、行级锁、并发 

Berkeley DB:支持事务 

还有一点要注意: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.

比如下列语句:

  1. ALTER FUNCTION 
  2. ALTER PROCEDURE 
  3. ALTER TABLE 
  4. BEGIN 
  5. CREATE DATABASE 
  6. CREATE FUNCTION 
  7. CREATE INDEX 
  8. CREATE PROCEDURE 
  9. CREATE TABLE 
  10. DROP DATABASE 
  11. DROP FUNCTION 
  12. DROP INDEX 
  13. DROP PROCEDURE 
  14. DROP TABLE 
  15. UNLOCK TABLES 
  16. LOAD MASTER DATA 
  17. LOCK TABLES 
  18. RENAME TABLE 
  19. TRUNCATE TABLE 
  20. SET AUTOCOMMIT=1 
  21. START TRANSACTION 

我们再来举个例子看下,代码如下:

  1. $sql1 = 'create table ScoreDetail_new(id int)'
  2. $sql2 = 'rename table ScoreDetail to ScoreDetail_bak'
  3. $sql3  = 'rename table ScoreDetail_new to ScoreDetail'
  4.  
  5. $mysqli = new mysqli('localhost','root','','DB_Lib2Test'); 
  6. $mysqli->autocommit(false);//开始事物 
  7. $mysqli->query($sql1); 
  8. $mysqli->query($sql2); 
  9. $mysqli->query($sql3); 
  10. if (!$mysqli->errno) { 
  11. //开源代码phpfensi.com 
  12.  $mysqli->commit(); 
  13.  echo 'ok'
  14. else { 
  15.  echo 'err'
  16.  $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网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论