Servlet容器中的事务

开发 后端
本文介绍Servlet容器中的事务,以及介绍J2EE事务的四个属性定义,分别是原子性,一致性,独立性和持久性。

J2EE除了提供了Servlet之外,还提供了大量的其它功能。Servlet开发者们也许难得使用这些功能,不情愿也没有时间用一个超出所需的大型J2EE服务器来替换自己的简单的Servlet容器。然而,依据J2EE的模块化特征,有可能将负责特定J2EE功能的小组件整合到Servlet容器里,以此来增强WEB应用程序。其中之一就是事务。有关J2EE事务的完整描述,您可以参考Onjava上的其他三篇文章,现在只需知道事务是资源的操作步骤(例如:数据库),它由四个属性定义,这四个属性根据其首字母浓缩为ACID:

原子性:事务的操作,或者是全部成功(此时提交事务),或者是全部不成功(此时回滚事务),谓之为all-or-nothing属性。一个事务应该被视为单个工作单元,在一个事务里面绝对不可能同时存在完成了的和没有完成的操作。

一致性:完成了的事务将资源从一个有效状态转变为另一个有效状态。一致性的具体例子有:数据库的参照完整性和表中的主键唯一性。

独立性在事务没有提交之前,事务作用的共享资源的改变在事务之外是不可见的。独立性确保了不同事务不会同时访问正在更新的数据。

持久性:由事务提交的改变会永久存在。

JOTM(Java Open Transaction Manager)是由ObjectWeb协会开发的功能完整的且资源开放的独立的事务管理器。它提供了JAVA应用程序的事务支持,而且与JTA(JAVA事务API)兼容。您可以在JOTM home page了解到更多的详细信息。在TOMCAT或其它Servlet容器整合了JOTM后,JSP和Servlet的开发者们就可以获得事务的优势轻而易举的创建更多健壮的web应用程序。

为了突出事务是怎样增强web应用程序的,举一个常用的例子,web浏览器与客户端交互的ATM。

ATM 样例:

情景

此例比较简单:一个客户想从 ATM 提款,输入了他的客户名称,john_doe;想提款数,$50。如果他的银行帐户上有足够的钱并且在 ATM 机上有足够的现金的话,应用程序就能给他相当数目的现金,并从银行帐户上提出同样的数目。否则,操作中断,并且除出现错误信息之外,其他都不会改变。我们无需担心安全问题,只是在猜想用户是否正确授权。

这是一个非常简单的例子,但是如果不使用事务,用别的方法执行起来将会很难。客户端操作将会涉及到两个不同的资源:ATM 和客户银行帐号。它们会自动的在应用程序设计中产生 ACID 问题。例如:如果在 ATM 上操作成功而在银行帐户上却失败(也许是因为交流失败),客户将会取到钱,但是他的帐户将不会更新。对于银行来说,这就亏大了。更糟的是,如果银行帐户更新了,但是由于一个错误阻止 ATM 传送钱,客户得不到现金,但是帐户上却提掉了这笔款。

为了防止出现上述事故,在你的应用程序里,你能够 1) 联系两个资源,并告知两者客户执行的所有当前操作,2)询问两者是否能执行操作,3)如果两者都同意,则请求操作。即使这样,此方法也不能谓之足够健壮,因为,如果客户帐户上的钱在第二步和第三步的时候被另外一操作提走,提款可能会失败,例如,客户帐户不能出现逆差。

事务能使应用程序更简单更健壮的之处就是:在同一事务的两个资源上执行所有的操作的时候,它将会解决 ACID 的问题(尤其是原子性)。

【编辑推荐】

  1. Scala语言中的Scala Servlet
  2. 叙述Servlet API的讨论
  3. 介绍Servlet容器与Context
  4. Servlet源文件到Class的过程
  5. 详解Listener监听Http Session
责任编辑:佚名 来源: 中国IT实验室
相关推荐

2009-07-09 11:27:59

Servlet容器

2009-07-07 16:23:05

Servlet容器

2009-07-08 14:22:36

Servlet容器匹配过程

2009-07-09 15:30:53

Servlet容器会话跟踪

2009-07-08 11:17:10

Servlet容器Servlet Con

2009-07-06 16:16:33

Servlet容器工作

2009-05-18 10:43:17

TomcatServletJetty

2009-07-08 15:59:55

doFilter方法

2022-03-31 15:17:04

JavaSocketServlet容器

2013-05-28 13:44:32

Android开发Android应用ijetty

2012-03-21 12:57:29

JavaJettyServlet

2017-01-19 15:32:36

Java全局事务本地事务

2009-07-07 08:46:18

JettyServlet容器

2009-07-03 16:53:11

Servlet容器

2019-12-09 15:00:48

TomcatServlet容器

2013-09-02 09:18:59

2020-07-21 14:35:44

Servlet容器ApacheTomcat

2011-04-29 09:15:16

Servlet

2009-06-06 19:25:44

javaServlet基础结构

2010-05-27 15:05:23

ServletJava
点赞
收藏

51CTO技术栈公众号