Java 理论与实践: 理解 JTS —— 事务简介
2010-03-22 00:00:00 来源:WEB开发网事务的动机
假设您正在从一个账户向另一个账户进行转账个账户差额由数据库表中的某一行来表示。如果您想从账户 A 转账到账户 B,则可能执行如下这些 SQL 代码:
SELECT accountBalance INTO aBalance
FROM Accounts WHERE accountId=aId;
IF (aBalance >= transferAmount) THEN
UPDATE Accounts
SET accountBalance = accountBalance - transferAmount
WHERE accountId = aId;
UPDATE Accounts
SET accountBalance = accountBalance + transferAmount
WHERE accountId = bId;
INSERT INTO AccountJournal (accountId, amount)
VALUES (aId, -transferAmount);
INSERT INTO AccountJournal (accountId, amount)
VALUES (bId, transferAmount);
else
FAIL "Insufficient funds in account";
END if
到目前为止,这段代码看起来非常简单易懂。如果手头的资金充足,则从一个账户中减去资金,并添加到另一个账户中。但是,如果出现系统电源故障或者崩溃,又会发生什么情况呢?表示账户 A 和账户 B 的行可能不会存储在同一个磁盘块中,这意味着要完成转账需要进行多个磁盘 IO。如果在已写入第一个磁盘块之后,在写入第二个磁盘块之前,系统发生故障,又会发生什么情况呢?A 账户中的资金已经划走,但是没有出现在账户 B 中(A 和 B 客户都不会愿意),或者资金将出现在账户 B 中,但是没有记入账户 A 的借出账中(银行不会愿意)。如果账户已正确更新,而账户日记账没有更新,又会发生什么情况呢?那么账户 A 和账户 B 的每月银行结账单将与它们账户的余额不一致。
更多精彩
赞助商链接