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


Posted in PHP onAugust 17, 2013

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调用Java对象的方法
Oct 09 PHP
在线竞拍系统的PHP实现框架(二)
Oct 09 PHP
杏林同学录(五)
Oct 09 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
PHP 七大优势分析
Jun 23 PHP
PHP版国家代码、缩写查询函数代码
Aug 14 PHP
php跨服务器访问方法小结
May 12 PHP
Yii+upload实现AJAX上传图片的方法
Jul 13 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 #PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 #PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 #PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 #PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 #PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
Aug 16 #PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 #PHP
You might like
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
Bootstrap基础学习
2015/06/16 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
python的即时标记项目练习笔记
2014/09/18 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Python中bisect的使用方法
2019/12/31 Python
Python如何实现FTP功能
2020/05/28 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Python with语句用法原理详解
2020/07/03 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
什么是lambda函数
2013/09/17 面试题
医学专业五年以上个人求职信
2013/12/03 职场文书
工地门卫岗位职责
2013/12/30 职场文书
团队经理竞聘书
2014/03/31 职场文书
中药学专业求职信
2014/05/31 职场文书
校本教研活动总结
2014/07/01 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android