事务嵌套
还是让我们看看我们的上一个国家银行的例子,它的目的是创建一个用来管理存款、提款的帐目对象以及一个用来保护钱款转帐时安全的转帐对象。FoxPro可以很容易地实现这个性能。VFP允许事务嵌套的深度多达五层。对所有事务的提交和放弃操作都由最外面的事务控制。 (第一个BEGIN TRANSACTION)。
USE mytable
?"Transaction level = " + STR(TXNLEVEL()) +
" Record count = " + STR(RECCOUNT("mytable"))
*-- 外层的事务处理
BEGIN TRANSACTION
?"Transaction level = " + STR(TXNLEVEL()) +
" Record count = " + STR(RECCOUNT("mytable"))
*-- 里层的事务处理Inner transaction
BEGIN TRANSACTION
INSERT INTO mytable (myfield) VALUES (6)
?"Transaction level = " + STR(TXNLEVEL()) +
" Record count = " + STR(RECCOUNT("mytable"))
*-- 提交里层的事务
END TRANSACTION
?"Transaction level = " + STR(TXNLEVEL()) +
" Record count = " + STR(RECCOUNT("mytable"))
*-- 放弃外层的事务
ROLLBACK
?"Transaction level = " + STR(TXNLEVEL()) +
" Record count = " + STR(RECCOUNT("mytable"))
这个例子是两级事务嵌套。在每个步骤中,显示了事务的级别和表格中记录的个数。TXNLEVEL()功能返回事务的级别。在每个BEGIN TRANSACTION 命令后, TXNLEVEL()返回第二大的数目,同时在里层的事务表格中插入一条记录,并且在END TRANSACTION命令后事务被提交。注意TXNLEVEL()从二减小到一。当最外层的事务被放弃后,里层事务中那条插入的记录失效,表格的内容恢复原样。
小结
事务嵌套是银行用来解决转帐问题的关键。转帐对象在最外层,帐目对象则在里层的事务级别。如果里层有两笔事务都提交了,则外层的事务也提交。但是如果里层的两笔事务中有一笔失败,则外层的事务恢复原样。即使是当一笔事务成功后,数据库的改变已经提交,最外层事务的放弃仍然会使所有内部事务所做的变化恢复原样。