PHP mysql与mysqli事务使用说明
发布:smiling 来源: PHP粉丝网 添加日期:2014-09-10 14:12:03 浏览: 评论:0
首先,mysqli 连接是永久连接,而mysql是非永久连接,什么意思呢?mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力.
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);
- //开源代码phpfensi.com
- $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) {
- //开源代码phpfensi.com
- $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了.
Tags: PHP mysql mysqli事务
相关文章
- ·PHP中通过Web 执行C/C++应用程序(2013-11-13)
- ·用PHP实现Ftp用户的在线管理(2013-11-13)
- ·用PHP自动把纯文本转换成Web页面(2013-11-13)
- ·用实例分析PHP5异常处理(2013-11-13)
- ·php5的simplexml解析错误(2013-11-13)
- ·PHP后门的隐藏技巧测试报告(2013-11-13)
- ·PHP缓存技术详谈(2013-11-27)
- ·利用PHP自定义错误处理器处理出错信息(2013-11-27)
- ·PHP作wap开发时遇到的问题(2013-11-27)
- ·php编写大型网站问题集(2013-11-27)
- ·php测试性能代码(2013-11-28)
- ·php 安全register globals设置为TRUE的危害(2013-11-28)
- ·XSLTProcessor 中 registerPHPFunctions 后无法调用 php 函数(2013-11-30)
- ·PHP中常用三种缓存技术(2013-11-30)
- ·新浪微博PHP版SDK的导致20007错误(2013-12-03)
- ·linux中phpMyAdmin错误提示Wrong permissions on configuration file, should no(2013-12-04)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)