快速业务通道

Java理论与实践: 理解JTS —— 事务简介 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

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

时间:2010-12-22 IBM Brian Goetz

Java Transaction Service 是 J2EE 架构的关键元素。它与 Java Transaction API 结合在一起,使我们能够构建对于各种系统和网络故障都非常 健壮的分布式应用程序。事务是可靠应用程序的基本构建块 —— 如果没有事务 的支持,编写可靠的分布式应用程序将是非常困难的。幸运的是,JTS 执行的大 部分工作对于程序员都是透明的;J2EE 容器使事务划分和资源征用对程序员来 说几乎是不可见的。这个由三个部分组成的系列文章的第一期讲述了一些基础知 识,包括什么是事务,以及事务对于构建可靠的分布式应用程序来说至关重要的 原因。

如果您阅读过任何有关 J2EE 的介绍性文章或者书籍,那么就会发现,只有 一小部分资料是专门针对 Java Transaction Service(JTS)或 Java Transaction API(JTA)的。这并不是因为 JTS 是 J2EE 中不重要的部分或者 可选部分 —— 恰恰相反。JTS 受到的关注之所以会比 EJB 技术少,是因为它 为应用程序提供的服务非常透明 —— 很多开发人员甚至没有注意到在他们的应 用程序中事务在哪里开始和结束。在某种意义上,JTS 的默默无闻恰恰是它的成 功:因为它非常有效地隐藏了事务管理的很多细节,因此,我们没有听说过或者 谈论过很多关于它的内容。但是,您可能想了解它在幕后都为您执行什么功能。

毫不夸张地说,没有事务就不能编写可靠的分布式应用程序。事务允许采用 某种控制方式修改应用程序的持久性状态,以便使应用程序对于各种各样的系统 故障(包括系统崩溃、网络故障、电源故障甚至自然灾害)更加健壮。事务是构 建容错、高可靠性以及高可用性应用程序所需的基本构建块之一。

事务的动机

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

不仅不可能同时将多个数据块写入磁盘,而且每当进行修改时马上将每个数 据块写入磁盘,也对系统性能有不利影响。将磁盘写入延迟到比较适宜的时间可 能会大大改善应用程序

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号