用新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为你展示了一个例子,列表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显示了可能的代码,列表 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); 数据挖掘研究院

  ?>
 
像你所看到的那样,脚本以连接数据库和关闭自动提交开始。然后执行一个SELECT查询,检索所有帐户的现金收支,接着构造一个有下拉式界面的表格,选择交易要用到的来源/目标帐户。图表A显示了最初的表格。 数据挖掘研究院


最初的表格 数据挖掘交友

一旦表格完成并提交后,两个UPDATE查询就开始实际执行借和贷操作。注意每一个查询的尾端都带有一个mysqli_rollback(),如果查询失败的话,它将被激活。假设没有查询失败的话,新的收支表就通过调用mysqli_commit()储存到数据库中。那时数据库连接就被关闭。

你可以自己试一下,从Savings #1转$500到Current #2。一旦你执行转帐之后,你将看到如图表B所示的平衡表的新结果。

数据挖掘工具


交易完成之后的状况。

提示:当然,这只是一个简单的双命令的事务。通常,当有许多SQL语句要一起执行的时候,你可以用这种事务模型,一个语句的失败对其他语句有串联的影响。在这些情况下,你会发现将mysqli_query()和mysqli_rollback()的调用压缩到一个单独的用户自定义的函数中,需要的时候调用它会更加简便。 数据挖掘工具

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

数据挖掘工具

转自:动态网站制作指南 | www.knowsky.com
[数据挖掘专家] [数据挖掘研究院] [数据挖掘论坛] [数据挖掘实验室]
上一篇:PHP开发框架的现状和展望
下一篇:用新PHP插件实现MySQL为基础的事务
最新评论共有 0 位网友发表了评论 , 查看所有评论
发表评论( 不能超过250字,需审核,请自觉遵守互联网相关政策法规。 )
匿名?
数据挖掘网站导航 数据挖掘论坛导航
  • 数据挖掘工具
  • 数据挖掘论坛
  • DataCruncher - Cognos
  • MineSet - MathSoft
  • Intelligent Miner - GainSmarts
  • Sqlserver - SAS - Clementine
  • CART - Weka - WizSoft
  • NeuroShell - ModelQuest
  • data mining tools - Darwin
  • 数据挖掘交友
  • 数据挖掘博客
  • 数据挖掘工具
  • 数据挖掘资源
  • 数据挖掘技术算法
  • 数据挖掘相关期刊、会议
  • 研究院联盟合作专区
  • 数据挖掘基础与相关技术
  • 数据挖掘厂商与就业
  • 数据挖掘研究者乐园
  • 知名厂商数据挖掘工具资料
  • 国内数据挖掘实验室
  • Foreign Data Mining Lab
  • 热点关注
  • P2P Search Engines-Napster
  • Peer to Peer ( P2P ) 综述
  • P2P Search Engines-Introduction
  • P2P Routing
  • P2P Search Engines-Music and P2P
  • P2P Search Engines-Historical Developmen
  • P2P Security
  • 如何从一个php文件向另一个地址post数据,
  • 基于PHP的AJAX技术实现文件异步上传
  • Copyright and P2P
  • 论坛最新话题
  • Foundations of Statistical Natural Langu
  • Game Theory meet Data Mining: A Recent P
  • System Building: How does it help or hin
  • 数据挖掘与Clementine培训
  • 新手报到
  • 求 SASEM 客户流失预测分析
  • 数据挖掘工程师/搜索研究院—北京——无线
  • 数据挖掘入门介绍(如何着手数据挖掘)
  • Information Overload Survey Results
  • The INEX 2005 Workshop on Element Retrie
  • 相关资讯
  • P2P Search Engines-Introduction
  • P2P Search Engines-Music and P2P
  • P2P Search Engines-Historical Developmen
  • Copyright and P2P
  • P2P Search Engines-Napster
  • GNUtella
  • YouServ ?An Analysis
  • Freenet
  • P2P Search Engines
  • P2P Routing
  • 数据挖掘实验室资料
  • 数据挖掘博客地址
  • 数据挖掘实验室网站地址
  • Prepare for Medicare audits by using dat
  • 注册成为SAS用户与爱好者俱乐部会员
  • 水南梅
  • 明日烟
  • 新人报道
  • 下载
  • 厦门服务器托管,450元/月—0592-5177319 高
  • 买空间送域名--0592-5177319 高静