zl程序教程

您现在的位置是:首页 >  后端

当前栏目

PHPmysql与mysqli事务使用说明分享

事务 使用 说明 分享 phpMySQL mysqli
2023-06-13 09:15:04 时间

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

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

比如下面的示例:

复制代码代码如下:

$mysqli=newmysqli("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="updateUsersetScoreCount=ScoreCount+10whereID="123456"";
$sql2="updateScoreDetail setFScore=300whereID="123456"";
$sql3="insertinto ScoreDetailID,Score)values("123456",60)";

$mysqli=newmysqli("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();
}


在这里,我们再使用phpmysql系列函数执行事务。

复制代码代码如下:
$sql1="updateUsersetScoreCount=ScoreCount+10whereID="123456"";
$sql2="updateScoreDetail setFScore=300whereID="123456"";
$sql3="insertinto ScoreDetailID,Score)values("123456",60)";

$conn=mysql_connect("localhost","root","");
mysql_select_db("DB_Lib2Test");
mysql_query("starttransaction");
//mysql_query("SETautocommit=0");

mysql_query($sql1);
mysql_query($sql2);
if(mysql_errno()){
 mysql_query("rollback");
 echo"err";
}else{
 mysql_query("commit");
 echo"ok";
}

//mysql_query("SETautocommit=1");
//mysql_query($sql3);

在这里要注意,

MyISAM:不支持事务,用于只读程序提高性能
InnoDB:支持ACID事务、行级锁、并发
BerkeleyDB:支持事务
还有一点要注意:MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务。

但往往,我们需要在使用事务的时候,是需要执行多条sql语句的。这就需要我们手动设置MySQL的autocommit属性为0,默认为1。

同时,使用STARTTRANSACTION语句显式的打开一个事务。如上面的示例。

如果不这样做,会有什么结果呢?

我们将上面第二段代码中//mysql_query(‘SETautocommit=0′);和//mysql_query($sql3);注释去掉,然后执行。

此时,mysql_query($sql3)执行就不会insert到数据库中。

如果我们将//mysql_query(‘SETautocommit=1′);本句注释去掉,那么mysql_query($sql3);就会执行成功。

通常COMMIT或ROLLBACK语句执行时才完成一个事务,但是有些DDL语句等会隐式触发COMMIT。

比如下列语句

ALTERFUNCTION
ALTERPROCEDURE
ALTERTABLE
BEGIN
CREATEDATABASE
CREATEFUNCTION
CREATEINDEX
CREATEPROCEDURE
CREATETABLE
DROPDATABASE
DROPFUNCTION
DROPINDEX
DROPPROCEDURE
DROPTABLE
UNLOCKTABLES
LOADMASTERDATA
LOCKTABLES
RENAMETABLE
TRUNCATETABLE
SETAUTOCOMMIT=1
STARTTRANSACTION

我们再来举个例子看下。

复制代码代码如下:
$sql1="createtableScoreDetail_new(idint)";
$sql2="renametableScoreDetailtoScoreDetail_bak";
$sql3 ="renametableScoreDetail_newtoScoreDetail";

$mysqli=newmysqli("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->showengines;(或执行mysql->showvariableslike"have_%";),查看InnoDB为YES,即表示数据库支持InnoDB了。
也就说明支持事务transaction了。