• php mysql 事务处理


    MYSQL 的事务处理主要有两种方法。

     1 、用 begin,rollback,commit 来实现

           begin 开始一个事务

           rollback 事务回滚

           commit 事务确认

       2 、直接用 set 来改变 mysql 的自动提交模式

        MYSQL 默认是自动提交的,也就是你提交一个 QUERY ,它就直接执行!我们可以通过

        set autocommit=0 禁止自动提交

        set autocommit=1 开启自动提交

        来实现事务的处理。

    当你用 set autocommit=0 的时候,你以后所有的 SQL 都将做为事务处理,直到你用 commit 确认或 rollback 结束。

    注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!

    个人推荐使用第一种方法!

    MYSQL 中只有 INNODB 和 BDB 类型的数据表才能支持事务处理!其他的类型是不支持的!

    *** : 一般 MYSQL 数据库默认的引擎是 MyISAM, 这种引擎不支持事务!如果要让 MYSQL 支持事务,可以自己手动修改 :

    方法如下: 1. 修改 c:appservmysqlmy.ini 文件,找到 skip-InnoDB, 在前面加上 # ,后保存文件。

              2. 在运行中输入: services.msc, 重启 mysql 服务。

              3. 到 phpmyadmin 中, mysql->show engines;( 或执行 mysql->show variables like 'have_%'; ), 查看 InnoDB 为 YES, 即表示数据库支持 InnoDB 了。

                也就说明支持事务 transaction 了。

              4. 在创建表时,就可以为 Storage Engine 选择 InnoDB 引擎了。如果是以前创建的表,可以使用 mysql->alter table table_name type=InnoDB;

                 或 mysql->alter table table_name engine=InnoDB; 来改变数据表的引擎以支持事务。

    以下是我做測試的示例代碼 :

    /*************** transaction--1 ***************/

           /* 方法一 */

        mysql_query("BEGIN"); // 或者 mysql_query("START TRANSACTION");
           // 若不使用事務,則 $sql 執行成功, $sql1 執行失敗   
           $sql = " insert into test values('11','88') ";
           $sql1 = " insert into test values('11','88','444') ";
           $res = mysql_query($sql);
           $res1 = mysql_query($sql1);  
    
           // 因爲使用了事務,則兩個 insert 都執行失敗
           if($res && $res1){
              mysql_query("COMMIT");
           }
           else{
              mysql_query("ROLLBACK");
           }
           mysql_query("END");

    /**************** transaction--2 *******************/

    /* 方法二 */

           mysql_query("SET AUTOCOMMIT=0"); // 設置 mysql 不自動提交,需自行用 commit 語句提交
           $sql = " insert into test values('11','88') ";
           $sql1 = " insert into test values('11','88','444') ";
           $res = mysql_query($sql);
           $res1 = mysql_query($sql1);  
          // 因爲使用了事務,則兩個 insert 都執行失敗
           if($res && $res1){
              mysql_query("COMMIT");
           }
           else{
              mysql_query("ROLLBACK");
           }
           mysql_query("END");

    /*************************** END ***************/

    对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:

    代码如下:

    //MyISAM & InnoDB 都支持,
    //Notes:query語句不能寫在一起如:mysql_query("select * from a;select * from b;"); 

        $sql_1=" LOCK TABLES test WRITE ";
        mysql_query($sql_1);
    
        $sql_2=" INSERT INTO test VALUES('".$a."','".$b."') ";
        if(mysql_query($sql_2)){
            echo 'successful!';
        }else{
            echo 'Unsuccessful!';
        }
    
        $sql_3=" UNLOCK TABLES ";
        mysql_query($sql_3);

    /*************************** END ***************/

    暗夜之中,才见繁星;危机之下,暗藏转机;事在人为,为者常成。
  • 相关阅读:
    非递归遍历二叉树Java
    【滴滴实习】滴滴2023届产研秋招储备实习生正在火热招募中🔥
    c++从office word的xml源文本文件中提取空行后的首个段落
    自建脚本安装docker
    银河麒麟安装软件失败,可使用命令行安装
    Fiddler+Proxifier抓pc应用包(c/s架构)
    11. Spring高级AOP概念
    10. Spring高级IOC的深入剖析
    12. Spring高级注解驱动AOP开发入门
    9. Spring高级注解驱动开发入门
  • 原文地址:https://www.cnblogs.com/zenghansen/p/4042369.html
Copyright © 2020-2023  润新知