首页 > 数据库 > MySQL > 正文

PHP mysql与mysqli事务使用说明

2020-03-22 17:19:33
字体:
来源:转载
供稿:网友
  • 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) html' target='_blank'>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); 就会执行成功。
    unity3d下载 http://www.unitymanual.com
    通常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,在前面加上#,后保存文件。www.it165.net
    2.在运行中输入:services.msc,重启mysql服务。
    3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了。
    也就说明支持事务transaction了。

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表