事务是企业应用开发中的重要概念,对于部分 Web 应用,事务也是非常重要的(试想一下,如果没有事务,ATM 和网银的操作将会使多么的危险)。下面我就对 Java EE 应用中各种事务技术做一个简介。
数据库:
无论 Java EE 中采用了何种的事务技术,归根结底都是基于数据库的事务。不论是本地事务,还是分布式事务,都必须有数据库的支持才行。各种 Java EE 事务技术也都调用了数据库的事务功能。提到事务,必然要提到事务的四个基本特性:原子性、一致性、隔离性和持久性。Java EE 应用中的各种事务技术直接的或间接的都要保证这四个特性的实现。作为最底层的技术,数据库系统毫无疑问要保证这四个特性被完整的实现。
数据库提供的事务功能是 Java EE 应用中事务的根本。数据库系统一般采用重执行日志保证事务的原子性、一致性和持久性。重执行日志记录了数据库变化的每一个动作,数据库系统会根据重执行日 志,在发生错误的时候撤销已执行的操作;或者在数据库重启时,将尚未持久化的数据重新执行操作。
对于事务的隔离性,数据库系统采用锁机制来实现,这和 Java 采用的对象锁机制实现线程同步类似,只有持有锁的事务才能操作数据。数据库系统为用户提供了手工操作锁机制的功能,用户在执行 DML 操作和 SELECT FOR UPDATE 时都会获得行锁定,用户也可以进行表锁定。但是手工的操作锁必然是很麻烦的,也容易出现错误,所以数据库系统也提供了自动锁机制,这就引出了数据库的事务 隔离级别。只要用户指定会话的事务隔离级别,数据库就会自动的为事务操作加上适当的锁,并维护这些锁。SQL 92 标准定义了4个等级的事务隔离级别,不同的隔离级别对各种事务并发问题的解决能力是不同的。
JDBC:
JDBC 是大家最为熟悉的技术之一,它是通过数据库系统来实现事务的,所以这里对它的介绍不多。只要调用相应的 API 就可以了,只要了解数据库系统的事务,理解 JDBC 的事务就非常容易了。使用 JDBC 需要数据库的支持,主流的数据库系统都支持单机的事务(相对分布式事务)。当然像一些内存数据库、文件数据库就不好说了。需要说明的是,JDBC 的事务只能在一个 Connection 内实现。
JTS 和 JTA:
JTS 规定了 App Server 如何为应用程序提供容器级的事务支持。JTA 规定了 App Server 可以向用户提供哪些 API 用于控制事务。
JTS/JTA 事务与 JDBC 的事务之间对大的不同是前者可以提供跨越多个数据库连接,而后者只能在单个数据库连接中实现事务。所以 JTS/JTA 事务对于企业级应用来说是非常重要的,也导致了大部分开发者对其不是很了解。
Hibernate:
Hibernate 是最常用和最流行的 ORM 框架。Hibernate 也提供了基于 JDBC 和 JTA 的事务功能,这也是将 JTS/JTA 事务放在 Hibernate 前面的原因。
因为 Hibernate 的事务是基于 JDBC 和 JTA 的,也可以使用容器管理事务,所以很多特性和 JDBC 和 JTA 等并无二异。需要特别提到的是 Hibernate 悲观锁和乐观锁这两个概念。Hibernate 的悲观锁利用的是数据库的行锁机制。使用悲观锁不仅可以保证本应用内的并发事务行,也可以保证使用相同数据库的其它应用不会访问或修改不应该的数据。但 是,悲观锁会影响到应用的并发访问性能。所以,在不是必须使用悲观锁的情况下可以使用乐观锁机制。乐观锁最常见的实现方式是使用 Version 字段,这也是 Hibernate 所推荐的方式。乐观锁可以保证事务和并发性能的兼得,但缺点是事务仅限于同一应用。关于悲观锁和乐观锁的详情很容易在书籍和网络上找到,这里我就不再拗 述。
Spring:
Spring 在其它技术的基础上,为开发人员提供了一组统一的易于适用的 API。除了通过编程的方式实现事务外,在 Spring 环境中,也可以使用 XML 或 Annotation 来实现声明式事务。
PlatformTransactionManager 在 Spring 的事务体系中是非常重要的一部分,它是一个抽象接口。HibernateTransactionManager、 JtaTransactionManager 等都实现了这个接口。这些 TransactionManager 的名字都很好理解,我也不多说了。
Spring 事务最吸引人的特性是声明式事务。Spring 通过 AOP 技术提供了对声明式事务的支持。随着 Spring 版本的更迭,现在使用 Spring 的事务支持已经变得非常容易了。
除此以外,Spring 还为 JMS 提供了本地事务功能,不过 JMS 的事务和数据库的事务有一定区别,我了解的也不是很多,所以在这里就不再介绍了。
这篇文章简单总结了一下 Java EE 应用中不同技术所提供的事务支持,写的很粗,欢迎大家补充。打算以后再简要介绍一下 Seam 的事务,如果有必要的话,呵呵。
分享到:
相关推荐
J2EE事务机制,深入了解j2ee的事务容器、事务管理等概念与技术
### J2EE在企业中的应用 #### 一、引言 在当今信息技术和电子商务迅速发展的背景下,企业面临着前所未有的挑战和机遇。为了在激烈的市场竞争中脱颖而出,企业必须采取有效措施来缩短销售周期、降低销售成本,并...
j2ee中文帮助文档j2ee中文帮助文档j2ee中文帮助文档j2ee中文帮助文档j2ee中文帮助文档j2ee中文帮助文档j2ee中文帮助文档j2ee中文帮助文档j2ee中文帮助文档j2ee中文帮助文档
它包括了组成J2EE平台的技术以及描述如何开发J2EE组件并部署在J2EE软件开发包上。 这篇指南不是为J2EE服务器及工具供应商准备的,它没有解释如何实现J2EE结构,也没有解释J2EE软件包。J2EE规范描述了J2EE结构并可以...
JavaServlet是J2EE中的核心组件之一,它扩展了Web服务器的功能,允许开发者编写动态网页。Servlet接收HTTP请求,处理这些请求,并返回响应给客户端。它们通常与JSP结合使用,Servlet负责逻辑,JSP负责视图展示。 3...
在J2EE中,JNDI常用来查找资源,如数据源、EJB引用或邮件会话。 6. **JTA(Java Transaction API)**:JTA是Java平台的一部分,用于处理分布式事务。它定义了应用程序如何与事务管理器交互,确保跨多个资源(如...
在J2EE中文API和Java 1.7 API官方文档中文版中,使用CHM格式可以方便用户快速查找所需的信息,同时节省存储空间。 **J2EE中文API** J2EE中文API文档通常会包含以下关键部分: 1. **Servlet**:定义了服务器端的...
EJB是J2EE中的企业级组件模型,用于构建可扩展的、安全的、事务处理的后端服务。EJB分为三种类型:Session Beans(会话bean)处理客户端交互,Message Driven Beans(消息驱动bean)处理消息队列,以及Entity Beans...
本文介绍了在J2EE项目开发中遇到的war包中的文件的读取问题,Ant使用中的OutOfMemoryError解决方法。
j2ee j2ee j2ee j2ee j2ee j2ee j2ee j2ee j2ee
不论是Web应用的开发,还是后台服务的实现,J2EE API都提供了强大的工具和框架,使得开发者能够在复杂的企业环境中高效地工作。因此,对于有意从事Java企业级应用开发的人来说,熟悉和精通J2EE API是至关重要的。
JDBC是Java访问数据库的标准接口,J2EE 1.5中包含的JDBC 3.0提供了连接管理、事务处理、结果集处理等方法,使得开发者可以便捷地进行数据库操作。 4. **EJB(Enterprise JavaBeans)**: EJB是J2EE的核心组件,...
J2EE中MVC三层架构的实现 1、课堂实践内容: JSP+持久层结构存在的问题 解决方法 J2EE的MVC架构(持久层+Jsp+Servlet) 图书列表功能MVC实现 图书修改功能MVC实现
Servlet是J2EE中的基础,负责处理HTTP请求;JSP则是一种动态网页技术,结合了HTML和Java代码,方便展示动态内容;JavaBean是可重用的Java组件,常用于业务逻辑处理;EJB是J2EE的高级组件,提供了一种标准的方式来...
这个中文API文档对于初级到高级的J2EE开发者都是宝贵的参考资料,无论是在学习阶段还是实际项目开发中,都可以快速查询和理解API的用法,提高开发效率。由于此类资源在网络上较为稀缺,这份文档的价值尤为凸显。用户...
- **J2EE容器**: 容器是J2EE中的核心概念之一,用于管理应用程序组件的生命周期,提供必要的服务如安全性、事务处理等。常见的容器类型包括Web容器、EJB容器等。 - **打包J2EE组件**: J2EE应用通常被打包成WAR或...
J2EE J2EE J2EE J2EE J2EE J2EE J2EE J2EE J2EE J2EE J2EE J2EE