PHP mysql与mysqli事务使用说明 分享

前端之家收集整理的这篇文章主要介绍了PHP mysql与mysqli事务使用说明 分享前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

MysqLi封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法

应用比较多的地方是 MysqLi的事务。

比如下面的示例:

代码如下:

$MysqLi = new MysqLi('localhost','root','','DB_Lib2Test');@H_404_11@$MysqLi->autocommit(false);//开始事物@H_404_11@$MysqLi->query($sql1);@H_404_11@$MysqLi->query($sql2);@H_404_11@if(!$MysqLi->errno){@H_404_11@ $MysqLi->commit();@H_404_11@ echo 'ok';@H_404_11@}else{@H_404_11@echo 'err';@H_404_11@ $MysqLi->rollback();@H_404_11@}@H_404_11@

PHP中,MysqLi 已经很好的封装了MysqL事务的相关操作。如下示例:

代码如下:
404_11@$sql1 = "update User set scoreCount = scoreCount +10 where ID= '123456'";@H_404_11@$sql2 = "update scoreDetail set Fscore = 300 where ID= '123456'";@H_404_11@$sql3 = "insert into scoreDetail ID,score) values ('123456',60)";

$MysqLi = new MysqLi('localhost','DB_Lib2Test');@H_404_11@$MysqLi->autocommit(false); // 开始事务@H_404_11@$MysqLi->query($sql1);@H_404_11@$MysqLi->query($sql2);@H_404_11@if (!$MysqLi->errno) {@H_404_11@$MysqLi->commit();@H_404_11@echo 'ok';@H_404_11@} else {@H_404_11@echo 'err';@H_404_11@$MysqLi->rollback();@H_404_11@}@H_404_11@

@H_404_11@在这里,我们再使用 PHP MysqL 系列函数执行事务。

代码如下:
404_11@$sql1 = "update User set scoreCount = scoreCount +10 where ID= '123456'";@H_404_11@$sql2 = "update scoreDetail set Fscore = 300 where ID= '123456'";@H_404_11@$sql3 = "insert into scoreDetail ID,60)";

$conn = MysqL_connect('localhost','');@H_404_11@MysqL_select_db('DB_Lib2Test');@H_404_11@MysqL_query('start transaction');@H_404_11@//MysqL_query('SET autocommit=0');

MysqL_query($sql1);@H_404_11@MysqL_query($sql2);@H_404_11@if (MysqL_errno()) {@H_404_11@MysqL_query('rollback');@H_404_11@echo 'err';@H_404_11@} else {@H_404_11@MysqL_query('commit');@H_404_11@echo 'ok';@H_404_11@}

// MysqL_query('SET autocommit=1');@H_404_11@// MysqL_query($sql3);@H_404_11@

在这里要注意,

MyISAM:不支持事务,用于只读程序提高性能 @H_404_11@InnoDB:支持ACID事务、行级锁、并发 @H_404_11@Berkeley DB:支持事务 @H_404_11@还有一点要注意: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@H_404_11@ALTER PROCEDURE@H_404_11@ALTER TABLE@H_404_11@BEGIN@H_404_11@CREATE DATABASE@H_404_11@CREATE FUNCTION@H_404_11@CREATE INDEX@H_404_11@CREATE PROCEDURE@H_404_11@CREATE TABLE@H_404_11@DROP DATABASE@H_404_11@DROP FUNCTION@H_404_11@DROP INDEX@H_404_11@DROP PROCEDURE@H_404_11@DROP TABLE@H_404_11@UNLOCK TABLES@H_404_11@LOAD MASTER DATA@H_404_11@LOCK TABLES@H_404_11@RENAME TABLE@H_404_11@TRUNCATE TABLE@H_404_11@SET AUTOCOMMIT=1@H_404_11@START TRANSACTION

我们再来举个例子看下。

代码如下:
404_11@$sql1 = 'create table scoreDetail_new(id int)';@H_404_11@$sql2 = 'rename table scoreDetail to scoreDetail_bak';@H_404_11@$sql3 = 'rename table scoreDetail_new to scoreDetail';

$MysqLi = new MysqLi('localhost','DB_Lib2Test');@H_404_11@$MysqLi->autocommit(false);//开始事物@H_404_11@$MysqLi->query($sql1);@H_404_11@$MysqLi->query($sql2);@H_404_11@$MysqLi->query($sql3);@H_404_11@if (!$MysqLi->errno) {@H_404_11@$MysqLi->commit();@H_404_11@echo 'ok';@H_404_11@} else {@H_404_11@echo 'err';@H_404_11@$MysqLi->rollback();@H_404_11@}@H_404_11@

@H_404_11@上面的示例中,假如$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了。@H_404_11@也就说明支持事务transaction了。

猜你在找的PHP相关文章