为说明它的实际应用,我们以一个存储用户账户的表格为例,如列表C所示:
列表C
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)
现在,假设我要转账400美元。实际的“事务”通过两个UPDATE语句来执行,一个语句将转账金额从源账户中取出,另一语句将其存入目标账户。如果我只是在账户间进行转账,那么整个过程中,所有账户的总余额(00)应一直保持不变。以下是完成转账的DBI代码(列表D):
列表D
#!/usr/bin/perl
use DBI;
# create database connection
my $dbh = DBI->connect("DBI:mysql:database=somedb;host=localhost", "user", "pass", {'RaiseError' => 1, 'AutoCommit' => 0});
# trap errors using eval{}
eval {
# debit account #1
$dbh->do("UPDATE accounts SET balance = balance-400 WHERE id=1");
# credit account #2
$dbh->do("UPDATE accounts SET balance = balance+400 WHERE id=2");
# no errors so far
# commit changes
$dbh->commit();
};
# any errors
# rollback
if ($@) {
print "Transaction aborted: $@";
$dbh->rollback();
}
# close connection
$dbh->disconnect();
在Perl中执行一个事务共有四个基本步骤:
如你所见,用Perl和MySQL执行事务模型能够使MySQL数据库在遇到查询执行错误时更加稳定。但是,在新开始着手用这些新特性重写代码前,必须注意,它们实际上增加了系统的性能消耗;因此,在执行它们之前,最好进行一下成本效益分析。祝你好运!
责任编辑:张琎
用户评论