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 相关文章推荐
vBulletin Forum 2.3.xx SQL Injection
Oct 09 PHP
PHP4(windows版本)中的COM函数
Oct 09 PHP
php获取某个目录大小的代码
Sep 10 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
LotusPhp笔记之:Cookie组件的使用详解
May 06 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
Apr 24 PHP
php实现用手机关闭计算机(电脑)的方法
Apr 22 PHP
Smarty实现页面静态化(生成HTML)的方法
May 23 PHP
Yii使用smsto短信接口的函数demo示例
Jul 13 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
PHP实现小偷程序实例
Oct 31 PHP
WHOOPS PHP调试库的使用
Sep 29 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 HTML代码串 截取实现代码
2009/06/29 PHP
PHP 遍历文件实现代码
2011/05/04 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
PHP chop()函数讲解
2019/02/11 PHP
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
python实现的解析crontab配置文件代码
2014/06/30 Python
Python3基础之函数用法
2014/08/13 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
秋季婚礼证婚词
2014/01/11 职场文书
结婚邀请函范文
2014/01/14 职场文书
小学三年级学生评语
2014/04/22 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
就业意向书范本
2015/05/11 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书