用一组新的PHP插件实现以MySQL为基础的事务

ZDNet软件频道 时间:2006-09-11 作者:Melonfire |  我要评论()
本文关键词:php mysql Mysql
这篇简短的教程将向您说明怎样利用这些新的MySQLi函数,用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 TRANSACTIONCOMMIT ROLLBACK命令。列表A为你展示了一个例子:

列表A


<?php
// 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()函数,继续用通常的方法进行INSERTUPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,Mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。
  • 假设组成事务组的所有命令都成功执行了,就要用Mysqli_commit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134