PHP mysql与mysqli事务使用说明 分享

 更新时间:2013年08月17日 12:17:39   作者:  
首先, mysqli 连接是永久连接,而mysql是非永久连接。什么意思呢? mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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中,mysqli 已经很好的封装了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)";

$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_query($sql2);
if (mysql_errno()) {
 mysql_query('rollback');
 echo 'err';
} else {
 mysql_query('commit');
 echo 'ok';
}

// mysql_query('SET autocommit=1');
// 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。

比如下列语句

ALTER FUNCTION
ALTER PROCEDURE
ALTER TABLE
BEGIN
CREATE DATABASE
CREATE FUNCTION
CREATE INDEX
CREATE PROCEDURE
CREATE TABLE
DROP DATABASE
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP TABLE
UNLOCK TABLES
LOAD MASTER DATA
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');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
$mysqli->query($sql3);
if (!$mysqli->errno) {
 $mysqli->commit();
 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版微信数据统计接口用法示例

    php版微信数据统计接口用法示例

    这篇文章主要介绍了php版微信数据统计接口用法,结合实例形式分析了php微信数据统计接口功能及相关的使用技巧,需要的朋友可以参考下
    2016-10-10
  • 生成静态页面的php函数,php爱好者站推荐

    生成静态页面的php函数,php爱好者站推荐

    生成静态页面的php函数,php爱好者站推荐...
    2007-03-03
  • PHP 配置后台登录以及模板引入

    PHP 配置后台登录以及模板引入

    本文主要介绍了PHP 配置后台登录以及模板引入的方法步骤。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • thinkPHP5实现的查询数据库并返回json数据实例

    thinkPHP5实现的查询数据库并返回json数据实例

    这篇文章主要介绍了thinkPHP5实现的查询数据库并返回json数据功能,结合实例形式分析了thinkPHP5数据库查询及json格式数据简单操作技巧,需要的朋友可以参考下
    2017-10-10
  • PHP操作XML作为数据库的类

    PHP操作XML作为数据库的类

    写入xml文件时速度粉快(我测试过30000条记录的情况),插入时只插入一条记录,修改速度也相当的快,挺适合中型网站生成XML时使用,所以推荐一下。
    2010-12-12
  • 深入理解PHP的远程多会话调试

    深入理解PHP的远程多会话调试

    这篇文章主要给大家介绍了关于PHP远程多会话调试的相关资料,文中通过示例代码以及图片介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • PHP curl 获取响应的状态码的方法

    PHP curl 获取响应的状态码的方法

    PHP curl可以从服务器端模拟一个http请求,例如抓取网页、模拟登陆等,想要获取状态码,需要在执行curl_exec后再通过curl_getinfo来获取
    2014-01-01
  • php+mysqli实现批量执行插入、更新及删除数据的方法

    php+mysqli实现批量执行插入、更新及删除数据的方法

    这篇文章主要介绍了php+mysqli实现批量执行插入、更新及删除数据的方法,主要涉及multi_query()函数的用法,需要的朋友可以参考下
    2015-01-01
  • php 中phar包的使用教程详解

    php 中phar包的使用教程详解

    下面这篇文章主要给大家介绍了关于PHP中phar包使用的相关资料,文中介绍的还是相对比较详细的,需要的朋友们下面来一起看看吧。
    2018-10-10
  • WebQQ最新登陆协议的用法

    WebQQ最新登陆协议的用法

    这篇文章主要介绍了WebQQ最新登陆协议的用法,分析了WebQQ协议的原理与用法,具有一定的实用价值,需要的朋友可以参考下
    2014-12-12

最新评论

?


http://www.vxiaotou.com