天天看點

PHP+MySQL事務處理示例代碼

注意支援事務的表必須是InnoDB類型。本例在 PHP5.2.5+MySQL5.0下測試通過。open_article 表的結構為:

SET FOREIGN_KEY_CHECKS=0;  

    — —————————-  

    — Table structure for open_article  

    CREATE TABLE `open_article` (  

      `nId` int(11) NOT NULL auto_increment,  

      `nOrder` int(11) default ‘0′,  

      `sTopic` varchar(100) default NULL,  

      `sContent` varchar(255) default NULL,  

      `dDatetime` timestamp NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,  

      PRIMARY KEY  (`nId`)  

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

    <?PHP  

      header(”Content-Type:text/html;charset=utf-8″);  

      $host = “localhost”;  

      $user = “root”;  

      $password = “mypassword”;  

      $db = “test_store_proc”;  

      $dblink = mysql_connect($host, $user, $password) or die(”Can’t connect to mysql”);  

      mysql_select_db($db, $dblink);  

      mysql_query(”SET NAMES UTF8″);  

      /* 建立事務 */ 

      mysql_query(’START TRANSACTION’) or exit(mysql_error());  

      //第1條插入語句:  

      $sql = “insert into open_article (nOrder, sTopic, sContent) values (0, ‘News Main Topic-1′,’資訊内容-1′)”;  

      if(!mysql_query($sql))  

      {  

         echo $sql .’:<br>’. mysql_errno() . “:” . mysql_error() . “<br>”;  

         mysql_query(’ROLLBACK’) or exit(’ROLLBACKing:’. mysql_error());  //判斷當執行失敗時復原  

         exit;  

      }  

      //第2條插入語句:  

      $sql = “insert into open_article (nOrder, sTopic, sContent) values (0, ‘News Main Topic-2′,’資訊内容-2′)”;  

        echo $sql .’:<br>’. mysql_errno() . “:” . mysql_error() . “<br>”;  

        mysql_query(’ROLLBACK’) or exit(’ROLLBACKing:’. mysql_error());  //判斷當執行失敗時復原  

        exit;  

      mysql_query(’COMMIT’) or exit(mysql_error());  //執行事務  

      mysql_close($dblink);  

    ?>  

    如果把第2條插入SQL語句改為:

    $sql = “insert into open_article (nOrder, sTopic2, sContent) values (0, ‘News Main Topic-2′,’資訊内容-2′)”;

    由于sTopic2字段不存在,程式會報錯終止。這時會發現沒有記錄被插入到表中,說明第1條插入SQL語句也沒有生效,實際是被事務復原了。

    怎麼看出是“被事務復原了”?因為open_article表的有個自動增量字段 nId。當重新糾正第2條插入SQL語句,再運作程式時,會發現 nId 的值跳了1,說明前次第1條插入SQL語句确實被執行了,然後又被取消了。

    結果記錄:

    — —————————-

    — Records

    INSERT INTO `open_article` VALUES (’1′, ‘0′, ‘News Main Topic-1′, ‘資訊内容-1′, ‘2010-03-06 05:59:07′);

    INSERT INTO `open_article` VALUES (’2′, ‘0′, ‘News Main Topic-2′, ‘資訊内容-2′, ‘2010-03-06 05:59:07′);

    INSERT INTO `open_article` VALUES (’3′, ‘0′, ‘News Main Topic-1′, ‘資訊内容-1′, ‘2010-03-06 06:00:13′);

    INSERT INTO `open_article` VALUES (’4′, ‘0′, ‘News Main Topic-2′, ‘資訊内容-2′, ‘2010-03-06 06:00:13′);

    INSERT INTO `open_article` VALUES (’6′, ‘0′, ‘News Main Topic-1′, ‘資訊内容-1′, ‘2010-03-06 06:06:13′);

    INSERT INTO `open_article` VALUES (’7′, ‘0′, ‘News Main Topic-2′, ‘資訊内容-2′, ‘2010-03-06 06:06:13′);

    INSERT INTO `open_article` VALUES (’8′, ‘0′, ‘News Main Topic-1′, ‘資訊内容-1′, ‘2010-03-06 06:11:46′);

    INSERT INTO `open_article` VALUES (’9′, ‘0′, ‘News Main Topic-2′, ‘資訊内容-2′, ‘2010-03-06 06:11:46′);

    注意上列記錄中,缺少 nId = 5 的記錄。

    測試代碼需要儲存成 utf8 格式。

本文轉自網眼51CTO部落格,原文連結:http://blog.51cto.com/itwatch/286458,如需轉載請自行聯系原作者