用新的PHP插件实现MySQL为基础的事务
2007-11-11 16:00:15 来源:WEB开发网工作实例
要了解这个在实践中是怎么工作的,让我们回到前面讨论过的银行转帐的例子.我们假设你的任务是建立一个简单的Web应用程序,让用户在他们的银行帐户间转帐。我们再进一步假设一个单独用户的帐户存储在一个MySQL(和PHP搭配之最佳组合)数据库中,如下所示:
MySQL(和PHP搭配之最佳组合)> 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 = MySQL(和PHP搭配之最佳组合)i_connect("localhost", "user", "pass", "test") or die("Cannot connect");
// turn off auto-commit
MySQL(和PHP搭配之最佳组合)i_autocommit($dbh, FALSE);
// look for a transfer
if ($_POST['submit'] && is_numeric($_POST['amt'])) {
// add $$ to target account
$result = MySQL(和PHP搭配之最佳组合)i_query($dbh, "UPDATE accounts SET balance = balance + " . $_POST['amt'] . " WHERE id = " . $_POST['to']);
if ($result !== TRUE) {
MySQL(和PHP搭配之最佳组合)i_rollback($dbh); // if error, roll back transaction
}
// subtract $$ from source account
$result = MySQL(和PHP搭配之最佳组合)i_query($dbh, "UPDATE accounts SET balance = balance - " . $_POST['amt'] . " WHERE id = " . $_POST['from']);
if ($result !== TRUE) {
MySQL(和PHP搭配之最佳组合)i_rollback($dbh); // if error, roll back transaction
}
// assuming no errors, commit transaction
MySQL(和PHP搭配之最佳组合)i_commit($dbh);
}
// get account balances
// save in array, use to generate form
$result = MySQL(和PHP搭配之最佳组合)i_query($dbh, "SELECT * FROM accounts");
while ($row = MySQL(和PHP搭配之最佳组合)i_fetch_assoc($result)) {
$accounts[] = $row;
}
// close connection
MySQL(和PHP搭配之最佳组合)i_close($dbh);
?>
更多精彩
赞助商链接