WEB开发网
开发学院软件开发Java Java 理论与实践: 理解 JTS —— 事务简介 阅读

Java 理论与实践: 理解 JTS —— 事务简介

 2010-03-22 00:00:00 来源:WEB开发网   
核心提示: 事务的动机假设您正在从一个账户向另一个账户进行转账个账户差额由数据库表中的某一行来表示,如果您想从账户 A 转账到账户 B,Java 理论与实践: 理解 JTS —— 事务简介(2),则可能执行如下这些 SQL 代码: SELECTaccountBalanceINTOaBalanceFROMAc

事务的动机

假设您正在从一个账户向另一个账户进行转账个账户差额由数据库表中的某一行来表示。如果您想从账户 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 的每月银行结账单将与它们账户的余额不一致。

上一页  1 2 3 4 5 6 7  下一页

Tags:Java 理论 实践

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接