事务处理支持很长时间以来一直是大多数MySQL开发者的心愿,随着Mysql 4.0的发布,这个心愿最后终于得以实现。Mysql 4.0后不久,拥有一个新的Mysql插件的php 5.x也发布了。这个新插件,Mysql Improved,使得PHP开发者通过利用本地的php函数,获得了这些新的事务处理能力。这篇简短的教程将向你说明怎样利用这些新的Mysqli函数,用php实现以Mysql为基础的事务。
概要
如果你还不知道,那么我可以告诉你,事务只是一组SQL语句,通常因为它们是彼此相互依赖的,所以要在全有或全无(all-or-nothing)的模式下执行。只有当所有组成的语句都执行成功了,一个事务才算是成功了;任何一个语句中的失败应该都会导致系统“回滚”到它先前的状态,以避免数据连接/崩溃问题。
对于这一点,两个银行帐户间的转帐是一个很好的例子。在数据库级,这样的转帐包括两个步骤:首先,从源帐户中扣除转帐的金额,然后将其加到目标帐户中。如果在第二步中发生了错误,那么第一步就必须被取消,以避免不相符的情况(和愤怒的客户聚众滋事)。事务安全系统将自动地撤到系统先前的“快照”。
大多数数据库(包括Mysql)通过一个命令的组合来完成这个:
php中的事务处理函数
php中的Mysqli插件引进了新的函数,帮助开发者利用Mysql的事务处理能力。实质上,这些函数对等地被叫做SQL START TRANSACTION,COMMIT和 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 中执行一项事务有三个基本的步骤: