应用程序说一致性是什么意思它就是什么意思。应用程序把几组应用程序状态的变化组织
到几个事务中,结果应用程序的状态就成了 定义上的(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:把相关操作归到单个事务中,但把不相关的操作放到单独的事务中。
容器管理的事务