日期:2014-05-19  浏览次数:20676 次

j2ee中的事务浅谈(转)

事务是企业应用开发中的重要概念,对于部分 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 的事务,如果有必要的话,呵呵。?