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 相关文章推荐
一个可以找出源代码中所有中文的工具
Oct 25 PHP
PHP 命名空间实例说明
Jan 27 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 PHP
php生成静态文件的多种方法分享
Jul 17 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
PHP中抽象类,接口功能、定义方法示例
Feb 26 PHP
基于laravel Request的所有方法详解
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 define函数的使用说明
2008/08/27 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
PHP之预定义接口详解
2015/07/29 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
原生js实现form表单序列化的方法
2018/08/02 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
Python变量作用范围实例分析
2015/07/07 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
python使用mysql的两种使用方式
2018/03/07 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
简单了解python的一些位运算技巧
2019/07/13 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
中国跨境电商:Tomtop
2017/03/16 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
开水果连锁店创业计划书
2013/12/29 职场文书
新年寄语2016
2015/08/17 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
深入浅析React中diff算法
2021/05/19 Javascript
详解Laravel框架的依赖注入功能
2021/05/27 PHP
python中的sys模块和os模块
2022/03/20 Python