PHP mysql与mysqli事务使用说明 分享
来源:互联网 发布:java dom解析xml 编辑:程序博客网 时间:2024/05/18 02:34
首先, mysqli 连接是永久连接,而mysql是非永久连接。
什么意思呢? mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力。
mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。
应用比较多的地方是 mysqli的事务。
比如下面的示例:
在PHP中,mysqli 已经很好的封装了mysql事务的相关操作。如下示例:
在这里,使用 php mysql 系列函数执行事务。
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。
比如下列语句:
再来举个例子看下。
上面的示例中,假如$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了。
什么意思呢? mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力。
mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。
应用比较多的地方是 mysqli的事务。
比如下面的示例:
<?php//mysqli实例//by www.jbxue.com$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事务的相关操作。如下示例:
<?php//mysqli事务操作//by www.jbxue.com$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 系列函数执行事务。
<?php//mysql函数执行事务//by www.jbxue.com$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 FUNCTIONALTER PROCEDUREALTER TABLEBEGINCREATE DATABASECREATE FUNCTIONCREATE INDEXCREATE PROCEDURECREATE TABLEDROP DATABASEDROP FUNCTIONDROP INDEXDROP PROCEDUREDROP TABLEUNLOCK TABLESLOAD MASTER DATALOCK TABLESRENAME TABLETRUNCATE TABLESET AUTOCOMMIT=1START TRANSACTION
再来举个例子看下。
<?php$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 mysql与mysqli事务使用说明 分享
- PHP mysql与mysqli事务
- php mysql与mysqli 区别
- 分享:mysql 与 mysqli的区别
- php+mysqli事务
- mysql mysqli处理事务
- php中mysql与mysqli的区别
- PHP与MySQL的交互(mysqli)
- PHP mysql 使用mysqli
- PHP mysql 和 mysqli
- php mysql->mysqli
- PHP数据库连接mysql与mysqli的区别与用法
- PHP数据库连接mysql与mysqli的区别与用法
- PHP数据库连接mysql与mysqli的区别与用法
- PHP数据库连接mysql与mysqli的区别与用法
- PHP数据库连接mysql与mysqli的区别与用法
- PHP数据库连接mysql与mysqli的区别与用法
- PHP数据库连接mysql与mysqli的区别与用法
- php中url传递中文字符,特殊危险字符的解决方法
- gethostname 得到主机名
- 硬盘寻址
- 三星下月发布智能手表Galaxy Gear
- 获取当前月份第一天的完整日期
- PHP mysql与mysqli事务使用说明 分享
- 给一个不多于5位的正整数,要求:求它是几位数并且逆序打印出各位数字。
- 网页制作中的一些注意事项,待续
- C# 操作数据库简介
- php与html的混合写法
- ZOJ 3633 Alice's present
- 互联网的女性主义特征
- oracle 表统计信息
- VC下AVI和BMP转化代码