中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > Mysql
用新的PHP插件实现MySQL为基础的事务
作者:pinkfox 时间:2007-06-21 15:16 出处:ccidnet.com 责编:月夜寒箫
              摘要:用新的PHP插件实现MySQL为基础的事务

事务处理支持很长时间以来一直是大多数MySQL开发者的心愿,随着MySQL 4.0的发布,这个心愿最后终于得以实现。MySQL 4.0后不久,拥有一个新的MySQL插件的PHP 5.x也发布了。这个新插件,MySQL Improved,使得PHP开发者通过利用本地的PHP函数,获得了这些新的事务处理能力。这篇简短的教程将向你说明怎样利用这些新的MySQLi函数,用PHP实现以MySQL为基础的事务。

概要

如果你还不知道,那么我可以告诉你,事务只是一组SQL语句,通常因为它们是彼此相互依赖的,所以要在全有或全无(all-or-nothing)的模式下执行。只有当所有组成的语句都执行成功了,一个事务才算是成功了;任何一个语句中的失败应该都会导致系统“回滚”到它先前的状态,以避免数据连接/崩溃问题。

对于这一点,两个银行帐户间的转帐是一个很好的例子。在数据库级,这样的转帐包括两个步骤:首先,从源帐户中扣除转帐的金额,然后将其加到目标帐户中。如果在第二步中发生了错误,那么第一步就必须被取消,以避免不相符的情况(和愤怒的客户聚众滋事)。事务安全系统将自动地撤到系统先前的“快照”。

大多数数据库(包括MySQL)通过一个命令的组合来完成这个:

* START TRANSACTION命令标志着一个新的事务组的开始。它后面常接一系列的SQL命令。

* COMMIT命令标志着一个事务组的结束,表示事务期间做的所有改变应该被提交或者使之永久化。

* ROLLBACK命令标志着一个事务组的结束,表示事务期间所做的所有改变应该被撤消。

PHP中的事务处理函数

PHP中的MySQLi插件引进了新的函数,帮助开发者利用MySQL的事务处理能力。实质上,这些函数对等地被叫做SQL START TRANSACTION,COMMIT和 ROLLBACK命令。列表A为你展示了一个例子:

 

 
              // connect to database
              $dbh = mysqli_connect($host, $user, $pass, $db);
              // turn off auto-commit
              mysqli_autocommit($dbh, FALSE);
              // run query 1
              $result = mysqli_query($dbh, $query1);
              if ($result !== TRUE) {
              mysqli_rollback($dbh); // if error, roll back transaction
              }
              // run query 2
              $result = mysqli_query($dbh, $query2);
              if ($result !== TRUE) {
              mysqli_rollback($dbh); // if error, roll back transaction
              }
              // and so on...
              // assuming no errors, commit transaction
              mysqli_commit($dbh);
              // close connection
              mysqli_close($dbh);
              ?>

在PHP 中执行一项事务有三个基本的步骤:

* 第一步是始终关掉数据库的“auto-commit”,它实质上意味着系统在你作出改变时就保存它们。这一点是很重要的,因为在一个事务处理环境中,你应该只有在确定了所有事务处理的“unit”都成功完成了以后,才保存你所做的改变。你可以通过mysqli_autocommit()函数关掉数据库的自动提交。

* 接下来,通过mysqli_query()函数,继续用通常的方法进行INSERT、UPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。

* 假设组成事务组的所有命令都成功执行了,就要用mysqli_commit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。

工作实例

要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL数据库中,如下所示:

 

  mysql> SELECT * FROM accounts;
              +----+------------+---------+
              | id | label | balance |
              +----+------------+---------+
              | 1 | Savings #1 | 1000 |
              | 2 | Current #1 | 2000 |
              | 3 | Current #2 | 3000 |
              +----+------------+---------+
              3 rows in set (0.34 sec)

现在,需要建立一个简单的界面,使用户能够输入一个现金数额,实现从一个帐户到另一个的转帐。实际的“交易”将用两个UPDATE语句来执行,一个将转帐金额从源帐户取出,即借方,另一个将转帐金额记入目标帐户,即贷方。假设我们所做的是在帐户之间进行转帐,那么所有帐户的可用结余总额($6000)应该一直保持不变。

列表B显示了可能的代码:

 

  // connect to database
              $dbh = mysqli_connect("localhost", "user", "pass", "test")
            or die("Cannot connect");
              // turn off auto-commit
              mysqli_autocommit($dbh, FALSE);
              // look for a transfer
              if ($_POST['submit'] && is_numeric($_POST['amt'])) {
              // add $$ to target account
              $result = mysqli_query($dbh, "UPDATE accounts
            SET balance = balance + " . $_POST['amt'] . " WHERE id = " . $_POST['to']);
              if ($result !== TRUE) {
              mysqli_rollback($dbh); // if error, roll back transaction
              }
              // subtract $$ from source account
              $result = mysqli_query($dbh, "UPDATE accounts SET balance = balance - "
            . $_POST['amt'] . " WHERE id = " . $_POST['from']);
              if ($result !== TRUE) {
              mysqli_rollback($dbh); // if error, roll back transaction
              }
              // assuming no errors, commit transaction
              mysqli_commit($dbh);
              }
              // get account balances
              // save in array, use to generate form
              $result = mysqli_query($dbh, "SELECT * FROM accounts");
              while ($row = mysqli_fetch_assoc($result)) {
              $accounts[] = $row;
              }
              // close connection
              mysqli_close($dbh);
              ?>
  

 

列表 B

用PHP和MySQL执行一个事务处理模型可以使你的MySQL数据库对查询执行的错误更稳固。但是,在你开始动手重写代码和使用这个模型之前,值得注意的是,事务确实会增加系统性能管理的消耗,所以,在实现这个模型之前,做一个成本效益分析始终是个好主意。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有