知识大全 用新的PHP插件实现MySQL为基础的事务
Posted 函数
篇首语:宁可身冷,不可心冷;宁可人穷,不可志穷。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用新的PHP插件实现MySQL为基础的事务相关的知识,希望对你有一定的参考价值。
用新的PHP插件实现MySQL为基础的事务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
事务处理支持很长时间以来一直是大多数MySQL开发者的心愿 随着MySQL 的发布 这个心愿最后终于得以实现 MySQL 后不久 拥有一个新的MySQL插件的PHP x也发布了 这个新插件 MySQL Improved 使得PHP开发者通过利用本地的PHP函数 获得了这些新的事务处理能力 这篇简短的教程将向你说明怎样利用这些新的MySQLi函数 用PHP实现以MySQL为基础的事务
概要
如果你还不知道 那么我可以告诉你 事务只是一组SQL语句 通常因为它们是彼此相互依赖的 所以要在全有或全无(all or nothing)的模式下执行 只有当所有组成的语句都执行成功了 一个事务才算是成功了 任何一个语句中的失败应该都会导致系统 回滚 到它先前的状态 以避免数据连接/崩溃问题
对于这一点 两个银行帐户间的转帐是一个很好的例子 在数据库级 这样的转帐包括两个步骤 首先 从源帐户中扣除转帐的金额 然后将其加到目标帐户中 如果在第二步中发生了错误 那么第一步就必须被取消 以避免不相符的情况(和愤怒的客户聚众滋事) 事务安全系统将自动地撤到系统先前的 快照
大多数数据库(包括MySQL)通过一个命令的组合来完成这个
* START TRANSACTION命令标志着一个新的事务组的开始 它后面常接一系列的SQL命令
* MIT命令标志着一个事务组的结束 表示事务期间做的所有改变应该被提交或者使之永久化
* ROLLBACK命令标志着一个事务组的结束 表示事务期间所做的所有改变应该被撤消
PHP中的事务处理函数
PHP中的MySQLi插件引进了新的函数 帮助开发者利用MySQL的事务处理能力 实质上 这些函数对等地被叫做SQL START TRANSACTION MIT和 ROLLBACK命令 列表A为你展示了一个例子
列表A
// connect to database
$dbh = mysqli_connect($host, $user, $pass, $db);
// turn off auto-mit
mysqli_automit($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, mit transaction
mysqli_mit($dbh);
// close connection
mysqli_close($dbh);
?>
在PHP 中执行一项事务有三个基本的步骤:
* 第一步是始终关掉数据库的“auto-mit”,它实质上意味着系统在你作出改变时就保存它们。tW.WiNGWiT.Com这一点是很重要的,因为在一个事务处理环境中,你应该只有在确定了所有事务处理的“unit”都成功完成了以后,才保存你所做的改变。你可以通过mysqli_automit()函数关掉数据库的自动提交。
* 接下来,通过mysqli_query()函数,继续用通常的方法进行INSERT、UPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。
* 假设组成事务组的所有命令都成功执行了,就要用mysqli_mit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。
工作实例
要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的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-mit
mysqli_automit($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, mit transaction
mysqli_mit($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);
?>
TRANSFER
相关参考
知识大全 解析VS2010利用VS.PHP插件调试PHP的方法
解析VS2010利用VS.PHP插件调试PHP的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 浅析php插件 HTMLPurifier HTML解析器
浅析php插件HTMLPurifierHTML解析器 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 如何使用FireFox插件FirePHP调试PHP
如何使用FireFox插件FirePHP调试PHP 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!使
知识大全 浅析php插件 Simple HTML DOM 用DOM方式处理HTML
浅析php插件SimpleHTMLDOM用DOM方式处理HTML 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起
利用mysql事务特性实现并发安全的自增ID示例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!项目
初学入门PHP和MySQL 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我想要使用要使用PHP
PHP调用MySQL的存储过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! MySQL好像从开
PHP实现的MySQL读写分离 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 主要特性 简单的
使用PHP实现Mysql读写分离 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本代码是从uch
10条PHP中用的mysql语句 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinzh