事务处理支持很长时间以来一直是大多数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:
<ccid_code></ccid_code><?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()函数,继续用通常的方法进行INSERT、UPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。
假设组成事务组的所有命令都成功执行了,就要用mysqli_commit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。
工作实例
要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL数据库中,如下所示:
<ccid_code></ccid_code>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语句来执行,一个将转帐金额从源帐户取出,即借方,另一个将转帐金额记入目标帐户,即贷方。假设我们所做的是在帐户之间进行转帐,那么所有帐户的可用结余总额(00)应该一直保持不变。
列表B显示了可能的代码:
列表 B:
<ccid_code></ccid_code><?php // 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 (<span class="a14c" id="zoom"> <p style="TEXT-INDENT: 2em">事务处理支持很长时间以来一直是大多数MySQL开发者的心愿,随着MySQL 4.0的发布,这个心愿最后终于得以实现。MySQL 4.0后不久,拥有一个新的MySQL插件的PHP 5.x也发布了。这个新插件,MySQL Improved,使得PHP开发者通过利用本地的PHP函数,获得了这些新的事务处理能力。这篇简短的教程将向你说明怎样利用这些新的MySQLi函数,用PHP实现以MySQL为基础的事务。 </p> <p style="TEXT-INDENT: 2em"><strong>概要</strong> </p> <p style="TEXT-INDENT: 2em">如果你还不知道,那么我可以告诉你,事务只是一组SQL语句,通常因为它们是彼此相互依赖的,所以要在全有或全无(all-or-nothing)的模式下执行。只有当所有组成的语句都执行成功了,一个事务才算是成功了;任何一个语句中的失败应该都会导致系统“回滚”到它先前的状态,以避免数据连接/崩溃问题。 </p> <p style="TEXT-INDENT: 2em">对于这一点,两个银行帐户间的转帐是一个很好的例子。在数据库级,这样的转帐包括两个步骤:首先,从源帐户中扣除转帐的金额,然后将其加到目标帐户中。如果在第二步中发生了错误,那么第一步就必须被取消,以避免不相符的情况(和愤怒的客户聚众滋事)。事务安全系统将自动地撤到系统先前的“快照”。 </p> <p style="TEXT-INDENT: 2em">大多数数据库(包括MySQL)通过一个命令的组合来完成这个: </p> <p style="TEXT-INDENT: 2em">START TRANSACTION命令标志着一个新的事务组的开始。它后面常接一系列的SQL命令。 </p> <p style="TEXT-INDENT: 2em">COMMIT命令标志着一个事务组的结束,表示事务期间做的所有改变应该被提交或者使之永久化。 </p> <p style="TEXT-INDENT: 2em">ROLLBACK命令标志着一个事务组的结束,表示事务期间所做的所有改变应该被撤消。 </p> <p style="TEXT-INDENT: 2em">PHP中的事务处理函数。 </p> <p style="TEXT-INDENT: 2em">PHP中的MySQLi插件引进了新的函数,帮助开发者利用MySQL的事务处理能力。实质上,这些函数对等地被叫做SQL START TRANSACTION,COMMIT和 ROLLBACK命令。列表A为你展示了一个例子: </p> <p style="TEXT-INDENT: 2em">列表A: </p> <p style="TEXT-INDENT: 2em"> </p> <ccid_nobr></ccid_nobr>
在PHP 中执行一项事务有三个基本的步骤: 第一步是始终关掉数据库的“auto-commit”,它实质上意味着系统在你作出改变时就保存它们。这一点是很重要的,因为在一个事务处理环境中,你应该只有在确定了所有事务处理的“unit”都成功完成了以后,才保存你所做的改变。你可以通过mysqli_autocommit()函数关掉数据库的自动提交。 接下来,通过mysqli_query()函数,继续用通常的方法进行INSERT、UPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。 假设组成事务组的所有命令都成功执行了,就要用mysqli_commit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。 工作实例 要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL数据库中,如下所示:
现在,需要建立一个简单的界面,使用户能够输入一个现金数额,实现从一个帐户到另一个的转帐。实际的“交易”将用两个UPDATE语句来执行,一个将转帐金额从源帐户取出,即借方,另一个将转帐金额记入目标帐户,即贷方。假设我们所做的是在帐户之间进行转帐,那么所有帐户的可用结余总额(00)应该一直保持不变。 列表B显示了可能的代码: 列表 B:
像你所看到的那样,脚本以连接数据库和关闭自动提交开始。然后执行一个SELECT查询,检索所有帐户的现金收支,接着构造一个有下拉式界面的表格,选择交易要用到的来源/目标帐户。 最初的表格 一旦表格完成并提交后,两个UPDATE查询就开始实际执行借和贷操作。注意每一个查询的尾端都带有一个mysqli_rollback(),如果查询失败的话,它将被激活。假设没有查询失败的话,新的收支表就通过调用mysqli_commit()储存到数据库中。那时数据库连接就被关闭。 你可以自己试一下,从Savings #1转0到Current #2。一旦你执行转帐之后,你将看到如图表B所示的平衡表的新结果。 交易完成之后的状况 提示:当然,这只是一个简单的双命令的事务。通常,当有许多SQL语句要一起执行的时候,你可以用这种事务模型,一个语句的失败对其他语句有串联的影响。在这些情况下,你会发现将mysqli_query()和mysqli_rollback()的调用压缩到一个单独的用户自定义的函数中,需要的时候调用它会更加简便。 正如你所看到的那样,用PHP和MySQL执行一个事务处理模型可以使你的MySQL数据库对查询执行的错误更稳固。但是,在你开始动手重写代码和使用这个模型之前,值得注意的是,事务确实会增加系统性能管理的消耗,所以,在实现这个模型之前,做一个成本效益分析始终是个好主意。 POST['submit'] && is_numeric (事务处理支持很长时间以来一直是大多数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:
在PHP 中执行一项事务有三个基本的步骤: 第一步是始终关掉数据库的“auto-commit”,它实质上意味着系统在你作出改变时就保存它们。这一点是很重要的,因为在一个事务处理环境中,你应该只有在确定了所有事务处理的“unit”都成功完成了以后,才保存你所做的改变。你可以通过mysqli_autocommit()函数关掉数据库的自动提交。 接下来,通过mysqli_query()函数,继续用通常的方法进行INSERT、UPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。 假设组成事务组的所有命令都成功执行了,就要用mysqli_commit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。 工作实例 要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL数据库中,如下所示:
现在,需要建立一个简单的界面,使用户能够输入一个现金数额,实现从一个帐户到另一个的转帐。实际的“交易”将用两个UPDATE语句来执行,一个将转帐金额从源帐户取出,即借方,另一个将转帐金额记入目标帐户,即贷方。假设我们所做的是在帐户之间进行转帐,那么所有帐户的可用结余总额(00)应该一直保持不变。 列表B显示了可能的代码: 列表 B:
像你所看到的那样,脚本以连接数据库和关闭自动提交开始。然后执行一个SELECT查询,检索所有帐户的现金收支,接着构造一个有下拉式界面的表格,选择交易要用到的来源/目标帐户。 最初的表格 一旦表格完成并提交后,两个UPDATE查询就开始实际执行借和贷操作。注意每一个查询的尾端都带有一个mysqli_rollback(),如果查询失败的话,它将被激活。假设没有查询失败的话,新的收支表就通过调用mysqli_commit()储存到数据库中。那时数据库连接就被关闭。 你可以自己试一下,从Savings #1转0到Current #2。一旦你执行转帐之后,你将看到如图表B所示的平衡表的新结果。 交易完成之后的状况 提示:当然,这只是一个简单的双命令的事务。通常,当有许多SQL语句要一起执行的时候,你可以用这种事务模型,一个语句的失败对其他语句有串联的影响。在这些情况下,你会发现将mysqli_query()和mysqli_rollback()的调用压缩到一个单独的用户自定义的函数中,需要的时候调用它会更加简便。 正如你所看到的那样,用PHP和MySQL执行一个事务处理模型可以使你的MySQL数据库对查询执行的错误更稳固。但是,在你开始动手重写代码和使用这个模型之前,值得注意的是,事务确实会增加系统性能管理的消耗,所以,在实现这个模型之前,做一个成本效益分析始终是个好主意。 POST['amt'])) { // add $ to target account $result = mysqli_query($dbh, "UPDATE accounts SET balance = balance + " .事务处理支持很长时间以来一直是大多数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:
在PHP 中执行一项事务有三个基本的步骤: 第一步是始终关掉数据库的“auto-commit”,它实质上意味着系统在你作出改变时就保存它们。这一点是很重要的,因为在一个事务处理环境中,你应该只有在确定了所有事务处理的“unit”都成功完成了以后,才保存你所做的改变。你可以通过mysqli_autocommit()函数关掉数据库的自动提交。 接下来,通过mysqli_query()函数,继续用通常的方法进行INSERT、UPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。 假设组成事务组的所有命令都成功执行了,就要用mysqli_commit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。 工作实例 要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL数据库中,如下所示:
现在,需要建立一个简单的界面,使用户能够输入一个现金数额,实现从一个帐户到另一个的转帐。实际的“交易”将用两个UPDATE语句来执行,一个将转帐金额从源帐户取出,即借方,另一个将转帐金额记入目标帐户,即贷方。假设我们所做的是在帐户之间进行转帐,那么所有帐户的可用结余总额(00)应该一直保持不变。 列表B显示了可能的代码: 列表 B:
像你所看到的那样,脚本以连接数据库和关闭自动提交开始。然后执行一个SELECT查询,检索所有帐户的现金收支,接着构造一个有下拉式界面的表格,选择交易要用到的来源/目标帐户。 最初的表格 一旦表格完成并提交后,两个UPDATE查询就开始实际执行借和贷操作。注意每一个查询的尾端都带有一个mysqli_rollback(),如果查询失败的话,它将被激活。假设没有查询失败的话,新的收支表就通过调用mysqli_commit()储存到数据库中。那时数据库连接就被关闭。 你可以自己试一下,从Savings #1转0到Current #2。一旦你执行转帐之后,你将看到如图表B所示的平衡表的新结果。 交易完成之后的状况 提示:当然,这只是一个简单的双命令的事务。通常,当有许多SQL语句要一起执行的时候,你可以用这种事务模型,一个语句的失败对其他语句有串联的影响。在这些情况下,你会发现将mysqli_query()和mysqli_rollback()的调用压缩到一个单独的用户自定义的函数中,需要的时候调用它会更加简便。 正如你所看到的那样,用PHP和MySQL执行一个事务处理模型可以使你的MySQL数据库对查询执行的错误更稳固。但是,在你开始动手重写代码和使用这个模型之前,值得注意的是,事务确实会增加系统性能管理的消耗,所以,在实现这个模型之前,做一个成本效益分析始终是个好主意。 POST['amt'] . " WHERE id = " .事务处理支持很长时间以来一直是大多数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:
在PHP 中执行一项事务有三个基本的步骤: 第一步是始终关掉数据库的“auto-commit”,它实质上意味着系统在你作出改变时就保存它们。这一点是很重要的,因为在一个事务处理环境中,你应该只有在确定了所有事务处理的“unit”都成功完成了以后,才保存你所做的改变。你可以通过mysqli_autocommit()函数关掉数据库的自动提交。 接下来,通过mysqli_query()函数,继续用通常的方法进行INSERT、UPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。 假设组成事务组的所有命令都成功执行了,就要用mysqli_commit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。 工作实例 要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL数据库中,如下所示:
现在,需要建立一个简单的界面,使用户能够输入一个现金数额,实现从一个帐户到另一个的转帐。实际的“交易”将用两个UPDATE语句来执行,一个将转帐金额从源帐户取出,即借方,另一个将转帐金额记入目标帐户,即贷方。假设我们所做的是在帐户之间进行转帐,那么所有帐户的可用结余总额(00)应该一直保持不变。 列表B显示了可能的代码: 列表 B:
像你所看到的那样,脚本以连接数据库和关闭自动提交开始。然后执行一个SELECT查询,检索所有帐户的现金收支,接着构造一个有下拉式界面的表格,选择交易要用到的来源/目标帐户。 最初的表格 一旦表格完成并提交后,两个UPDATE查询就开始实际执行借和贷操作。注意每一个查询的尾端都带有一个mysqli_rollback(),如果查询失败的话,它将被激活。假设没有查询失败的话,新的收支表就通过调用mysqli_commit()储存到数据库中。那时数据库连接就被关闭。 你可以自己试一下,从Savings #1转0到Current #2。一旦你执行转帐之后,你将看到如图表B所示的平衡表的新结果。 交易完成之后的状况 提示:当然,这只是一个简单的双命令的事务。通常,当有许多SQL语句要一起执行的时候,你可以用这种事务模型,一个语句的失败对其他语句有串联的影响。在这些情况下,你会发现将mysqli_query()和mysqli_rollback()的调用压缩到一个单独的用户自定义的函数中,需要的时候调用它会更加简便。 正如你所看到的那样,用PHP和MySQL执行一个事务处理模型可以使你的MySQL数据库对查询执行的错误更稳固。但是,在你开始动手重写代码和使用这个模型之前,值得注意的是,事务确实会增加系统性能管理的消耗,所以,在实现这个模型之前,做一个成本效益分析始终是个好主意。 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 - " .事务处理支持很长时间以来一直是大多数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:
在PHP 中执行一项事务有三个基本的步骤: 第一步是始终关掉数据库的“auto-commit”,它实质上意味着系统在你作出改变时就保存它们。这一点是很重要的,因为在一个事务处理环境中,你应该只有在确定了所有事务处理的“unit”都成功完成了以后,才保存你所做的改变。你可以通过mysqli_autocommit()函数关掉数据库的自动提交。 接下来,通过mysqli_query()函数,继续用通常的方法进行INSERT、UPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。 假设组成事务组的所有命令都成功执行了,就要用mysqli_commit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。 工作实例 要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL数据库中,如下所示:
现在,需要建立一个简单的界面,使用户能够输入一个现金数额,实现从一个帐户到另一个的转帐。实际的“交易”将用两个UPDATE语句来执行,一个将转帐金额从源帐户取出,即借方,另一个将转帐金额记入目标帐户,即贷方。假设我们所做的是在帐户之间进行转帐,那么所有帐户的可用结余总额(00)应该一直保持不变。 列表B显示了可能的代码: 列表 B:
像你所看到的那样,脚本以连接数据库和关闭自动提交开始。然后执行一个SELECT查询,检索所有帐户的现金收支,接着构造一个有下拉式界面的表格,选择交易要用到的来源/目标帐户。 最初的表格 一旦表格完成并提交后,两个UPDATE查询就开始实际执行借和贷操作。注意每一个查询的尾端都带有一个mysqli_rollback(),如果查询失败的话,它将被激活。假设没有查询失败的话,新的收支表就通过调用mysqli_commit()储存到数据库中。那时数据库连接就被关闭。 你可以自己试一下,从Savings #1转0到Current #2。一旦你执行转帐之后,你将看到如图表B所示的平衡表的新结果。 交易完成之后的状况 提示:当然,这只是一个简单的双命令的事务。通常,当有许多SQL语句要一起执行的时候,你可以用这种事务模型,一个语句的失败对其他语句有串联的影响。在这些情况下,你会发现将mysqli_query()和mysqli_rollback()的调用压缩到一个单独的用户自定义的函数中,需要的时候调用它会更加简便。 正如你所看到的那样,用PHP和MySQL执行一个事务处理模型可以使你的MySQL数据库对查询执行的错误更稳固。但是,在你开始动手重写代码和使用这个模型之前,值得注意的是,事务确实会增加系统性能管理的消耗,所以,在实现这个模型之前,做一个成本效益分析始终是个好主意。 POST['amt'] . " WHERE id = " .事务处理支持很长时间以来一直是大多数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:
在PHP 中执行一项事务有三个基本的步骤: 第一步是始终关掉数据库的“auto-commit”,它实质上意味着系统在你作出改变时就保存它们。这一点是很重要的,因为在一个事务处理环境中,你应该只有在确定了所有事务处理的“unit”都成功完成了以后,才保存你所做的改变。你可以通过mysqli_autocommit()函数关掉数据库的自动提交。 接下来,通过mysqli_query()函数,继续用通常的方法进行INSERT、UPDATE和/或DELETE查询。检验每一个查询返回的值,弄清楚它是否成功了是很重要的。如果其中任何一个查询失败了,mysqli_rollback()函数就会被用来将系统返回到事务进行之前的状态。 假设组成事务组的所有命令都成功执行了,就要用mysqli_commit()函数将变化保存到数据库系统。请注意,一旦这个函数被调用,事务就不能被撤消了。 工作实例 要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL数据库中,如下所示:
现在,需要建立一个简单的界面,使用户能够输入一个现金数额,实现从一个帐户到另一个的转帐。实际的“交易”将用两个UPDATE语句来执行,一个将转帐金额从源帐户取出,即借方,另一个将转帐金额记入目标帐户,即贷方。假设我们所做的是在帐户之间进行转帐,那么所有帐户的可用结余总额(00)应该一直保持不变。 列表B显示了可能的代码: 列表 B:
像你所看到的那样,脚本以连接数据库和关闭自动提交开始。然后执行一个SELECT查询,检索所有帐户的现金收支,接着构造一个有下拉式界面的表格,选择交易要用到的来源/目标帐户。 最初的表格 一旦表格完成并提交后,两个UPDATE查询就开始实际执行借和贷操作。注意每一个查询的尾端都带有一个mysqli_rollback(),如果查询失败的话,它将被激活。假设没有查询失败的话,新的收支表就通过调用mysqli_commit()储存到数据库中。那时数据库连接就被关闭。 你可以自己试一下,从Savings #1转0到Current #2。一旦你执行转帐之后,你将看到如图表B所示的平衡表的新结果。 交易完成之后的状况 提示:当然,这只是一个简单的双命令的事务。通常,当有许多SQL语句要一起执行的时候,你可以用这种事务模型,一个语句的失败对其他语句有串联的影响。在这些情况下,你会发现将mysqli_query()和mysqli_rollback()的调用压缩到一个单独的用户自定义的函数中,需要的时候调用它会更加简便。 正如你所看到的那样,用PHP和MySQL执行一个事务处理模型可以使你的MySQL数据库对查询执行的错误更稳固。但是,在你开始动手重写代码和使用这个模型之前,值得注意的是,事务确实会增加系统性能管理的消耗,所以,在实现这个模型之前,做一个成本效益分析始终是个好主意。 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); ?>TRANSFER |

Lockwaittimeoutexceeded;tryrestartingtransaction-如何解决MySQL报错:事务等待超时在使用MySQL数据库时,有时可能会遇到一个常见的错误:Lockwaittimeoutexceeded;tryrestartingtransaction,该错误表示事务等待超时。这个错误通常发生在并

PHP是一种广泛使用的开源服务器端脚本语言,它可以处理Web开发中所有的任务。PHP在网页开发中的应用广泛,尤其是在动态数据处理上表现优异,因此被众多开发者喜爱和使用。在本篇文章中,我们将一步步地讲解PHP基础知识,帮助初学者从入门到精通。一、基本语法PHP是一种解释性语言,其代码类似于HTML、CSS和JavaScript。每个PHP语句都以分号;结束,注

1.PDO简介PDO是PHP的一个扩展库,它提供了一个面向对象的方式来操作数据库。PDO支持多种数据库,包括Mysql、postgresql、oracle、SQLServer等。PDO使开发人员能够使用统一的api来操作不同的数据库,这使得开发人员可以在不同的数据库之间轻松切换。2.PDO连接数据库要使用PDO连接数据库,首先需要创建一个PDO对象。PDO对象的构造函数接收三个参数:数据库类型、主机名、数据库用户名和密码。例如,以下代码创建了一个连接到mysql数据库的对象:$dsn="mysq

PHP数据对象(PDO)扩展提供了与数据库服务器高效且面向对象的交互。其高级查询和更新功能使开发人员能够执行复杂的数据库操作,从而提高性能和代码可维护性。本文将深入探讨PDO的高级查询和更新功能,指导您掌握其强大功能。高级查询:使用占位符和绑定参数占位符和绑定参数是提高查询性能和安全性的重要工具。占位符使用问号(?)表示查询中可替换的参数,而绑定参数则允许指定每个参数的数据类型和值。通过使用这些方法,您可以避免sql注入攻击并提高性能,因为数据库引擎可以提前优化查询。//使用占位符$stmt=$

学习MySQL的事务处理技巧有哪些?引言:事务是数据库管理系统中非常重要的概念,它提供了一种保证数据完整性和一致性的机制。在MySQL中,事务是一组SQL语句的执行单元,可以保证这组SQL语句要么全部执行成功,要么全部执行失败回滚。本文将介绍学习MySQL的事务处理技巧,并给出相应的代码示例。开启事务:在MySQL中,可以使用BEGIN、STARTTRAN

MongoDB技术开发中遇到的事务管理问题解决方案分析随着现代应用程序变得越来越复杂和庞大,对数据的事务处理需求也越来越高。作为一种流行的NoSQL数据库,MongoDB在数据管理方面有着出色的性能和扩展性。然而,MongoDB在数据一致性和事务管理方面相对较弱,给开发人员带来了挑战。在本文中,我们将探讨在MongoDB开发中遇到的事务管理问题,并提出一些解

Go语言是一种由Google开发的静态类型、编译型语言,其简洁、高效的特性受到了广泛的开发者关注和喜爱。在学习Go语言的过程中,熟练掌握变量的基础知识是至关重要的一步。本文将通过具体的代码示例来讲解Go语言中变量的定义、赋值、类型推断等基础知识,帮助读者更好地理解和掌握这些知识点。在Go语言中,定义一个变量可以使用关键字var,即var变量名变量类型的格

在MySQL中,事务隔离级别是一个非常重要的概念,它决定了在同时执行多个事务时,数据库会如何处理数据的并发访问。在实际应用中,我们需要根据具体的业务需求来选择适当的隔离级别,以提高MySQL的性能。首先,我们需要了解MySQL的四个事务隔离级别:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ和SERIALIZA


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver Mac version
Visual web development tools

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Notepad++7.3.1
Easy-to-use and free code editor

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Mac version
God-level code editing software (SublimeText3)
