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 相关文章推荐
mysq GBKl乱码
Nov 28 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
php正则preg_replace_callback函数用法实例
Jun 01 PHP
PHP中的Trait 特性及作用
Apr 03 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 PHP
PHP实现数组的笛卡尔积运算示例
Dec 15 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
php微信公众号开发之答题连闯三关
Oct 20 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中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
PHP程序员的技术成长规划
2016/03/25 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
Vuex简单入门
2017/04/19 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
python3操作微信itchat实现发送图片
2018/02/24 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
Pytorch to(device)用法
2020/01/08 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
优秀导游先进事迹材料
2014/01/25 职场文书
法律进社区实施方案
2014/03/21 职场文书
产品质量承诺书
2014/03/27 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
小学生寒假家长评语
2014/04/16 职场文书
第一军规观后感
2015/06/12 职场文书
九九重阳节致辞
2015/07/31 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
《将心比心》教学反思
2016/02/23 职场文书
Java中的随机数Random
2022/03/17 Java/Android
SQL Server使用导出向导功能
2022/04/08 SQL Server