background image

应用程序说一致性是什么意思它就是什么意思。应用程序把几组应用程序状态的变化组织

 

到几个事务中,结果应用程序的状态就成了 定义上的(by definition)一致。然后资源管理器
确保如果它必须从故障恢复的话,就把应用程序状态恢复到最近的一致状态。

 

  在第 1 部分中,我们给出了一个在银行应用程序中将资金从一个帐户转移到另一个

 

帐户的示例。清单 1 

 

展示了这个示例可能的 SQL 

 

实现,它包含 5   

个 SQL 操作(一个选择,

两个更新和两个插入操作):

 

  清单 1. 

 

资金转移的样本 SQL 代码

1

SELECT

 accountBalance 

INTO

 aBalance 

2

    

FROM

 Accounts 

WHERE

 accountId

=

aId;

3

IF

 (aBalance 

>=

 transferAmount) 

THEN

 

4

    

UPDATE

 Accounts 

5

        

SET

 accountBalance 

=

 accountBalance 

-

 transferAmount

6

        

WHERE

 accountId 

=

 aId;

7

    

UPDATE

 Accounts 

8

        

SET

 accountBalance 

=

 accountBalance 

+

 transferAmount

9

        

WHERE

 accountId 

=

 bId;

10

    

INSERT

 

INTO

 AccountJournal (accountId, amount)

11

        

VALUES

 (aId, 

-

transferAmount);

12

    

INSERT

 

INTO

 AccountJournal (accountId, amount)

13

        

VALUES

 (bId, transferAmount);

14

ELSE

15

    FAIL "Insufficient funds 

in

 account";

16

END

 

IF

17

 

   如果我们把这个操作作为五个单独的事务来执行会发生什么情况?这样不仅会使执
行速度变慢(由于事务开销)

 

,还会失去一致性。例如,如果一个人从帐户 A 取了钱,作为

 

执行第一次 SELECT(检查余额)

 

和随后的记入借方 UPDATE 之间的一个单独事务的一部

分,会发生什么情况?

   

这样会违反我们认为这段代码会强制遵守的业务规则 ― 帐户余额

 

应该是非负的。如果在第一次 UPDATE 

 

和第二次 UPDATE 之间系统失败会发生什么情况?

 

现在,当系统恢复时,钱已经离开了帐户 A 

 

但还没有记入帐户 B 的贷方,并且也无记录

说明原因。这样,哪个帐户的所有者都不会开心。

 

  清单 1 

 

中的五个 SQL 

   

操作是单个相关操作 ― 将资金从一个帐户转移到另一个帐户

   

― 的一部分。因此,我们希望要么全部执行它们,要么一个也不执行,建议在单个事务

中全部执行它们。
 

 

 规则 3:将相关操作归到单个事务中。

  理想化的平衡

 

 

   规则 1 

 

说事务应尽可能短小。清单 1 中的示例表明有时候我们必须把一些操作归到

一个事务中来维护一致性。当然,它要依赖应用程序来确定 相关操作 是由什么组成的。

 

我们可以把规则 1   

和 3 结合在一起,提供一个描述事务范围的一般指导,我们规定它为

 

规则 4:

 

  规则 4:把相关操作归到单个事务中,但把不相关的操作放到单独的事务中。
  容器管理的事务