Java理论与实践: 理解JTS —— 事务简介 - 编程入门网
序进行类比,事务在应用程序级别所提供的一些优势 与 catch 和 finally 块在方法级别所提供的优势相同;它们使我们不用编写很 多错误复原代码,即可执行可靠的错误复原。考虑下面这个方法,该方法将一个 文件复制到另一个文件:
忽略为整个文件分配一个缓冲区是一个不好的想法,但是在这个方法中哪里 错了呢?有很多东西。输入文件可能不存在,或者该用户可能没有这个文件的读 权限。用户可能没有输出文件的写权限,或者该文件被另一个用户锁定。可能没 有足够的磁盘空间来完成该文件的写操作,或者由于没有足够的内存可用,分配 缓冲区可能失败。幸运的是,所有这些都由 finally 语句来处理,该语句释放 了 copyFile() 所使用的所有资源。 如果您使用原来的C语言编写这个方法,则对于每个操作(打开输入、打开 输出、malloc、读、写),必须测试返回状态,如果操作失败,则取消以前成功 的所有操作,并返回适当的状态代码。由于需要这么多错误处理代码,该代码可 能更大,因此更难阅读。同时在错误处理代码(它也是最难测试的部分)中很容 易出错,比如不能释放资源、对一个资源释放两次或者释放尚未分配的资源。更 复杂的方法可能涉及更多资源,而不仅仅是两个文件和一个缓冲区,这使得问题 变得更加复杂。在大量错误复原代码中,很难发现实际的程序逻辑。 现在,假设您正在执行一个复杂的操作,该操作涉及在多个数据库中插入或 更新多个行,其中一个操作违反了完整性约束并失败了。如果您管理自己的错误 复原,则必须跟踪已经执行的操作,并知道在随后的操作失败的情况下如何取消 每个操作。如果工作单元分布在多个方法或组件上,则会更加困难。借助事务来 构造应用程序,就可以将所有这些清理工作委托给数据库(即进行 ROLLBACK) ,并取消自从事务开始所执行的所有操作。 结束语 通过借助事务构造应用程序,我们定义一组正确的应用程序状态转换,并确 保应用程序始终处于正确的状态,甚至在系统或组件发生故障之后也是如此。事 务使我们能够将很多异常处理和恢复工作委托给 TPM 和 RM,从而简化了我们的 代码,并使我们能够空出更多时间来考虑应用程序逻辑。 在此系列的第 2 部分中,我们将探讨这对于 J2EE 应用程序意味着什么 — — J2EE 如何使我们能够将事务语义告知 J2EE 组件(EJB 组件、servlet 以及 JSP 页面);它如何使资源征用对应用程序(甚至对于 bean 管理的事务)完全 透明;单个事务如何透明地遵循从一个 EJB 组件到另一个 EJB 组件,或者从一 个 servlet 到一个 EJB 组件,甚至跨越多个系统的控制流程。 尽管 J2EE 提供了相当透明的对象事务服务,但是应用程序设计者仍然必须 仔细考虑在哪里划分事务,以及如何在应用程序中使用事务资源 —— 不正确的 事务划分可能会使应用程序处于不一致的状态,而不正确地使用事务资源可能会 造成非常严重的性能问题。在此系列的第 3 部分中,我们将讨论这些问题并提 供一些关于如何构造 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |