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的五种设计模式
Sep 05 PHP
php笔记之:数据类型与常量的使用分析
May 14 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
PHP实现数字补零功能的2个函数介绍
May 12 PHP
PHP登录环节防止sql注入的方法浅析
Jun 30 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
php自动加载方式集合
Apr 04 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
Mar 19 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 PHP
PHP随机数函数rand()与mt_rand()的讲解
Mar 25 PHP
php抽象方法和普通方法的区别点总结
Oct 13 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
PHP中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
php实现socket推送技术的示例
2017/12/20 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
js读写json文件实例代码
2014/10/21 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
微信小程序之picker日期和时间选择器
2017/02/09 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
详解详解Python中writelines()方法的使用
2015/05/25 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
餐饮业的创业计划书范文
2013/12/26 职场文书
企业内部培训方案
2014/02/04 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
廉政承诺书2015
2015/04/28 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书