`
footman265
  • 浏览: 118341 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

j2ee中的事务浅谈(转)

    博客分类:
  • j2SE
阅读更多

事务是企业应用开发中的重要概念,对于部分 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在企业中的应用 #### 一、引言 在当今信息技术和电子商务迅速发展的背景下,企业面临着前所未有的挑战和机遇。为了在激烈的市场竞争中脱颖而出,企业必须采取有效措施来缩短销售周期、降低销售成本,并...

    浅谈基于Struts和Hibernate的J2EE应用

    在J2EE应用中,Struts处理控制逻辑,而Hibernate负责数据持久化。将两者结合,可以在Struts的Action中调用Hibernate的Session接口进行数据的CRUD操作。通过这种方式,开发者可以利用Struts的MVC结构进行流程控制,...

    浅谈J2EE框架和分布式网络管理.pdf

    3. 强大的事务管理:在网络管理过程中,J2EE提供的事务管理保证了数据的一致性和完整性。 4. 安全性:J2EE提供了多种安全机制,确保网络管理和数据传输的安全性,如认证授权、SSL加密等。 总结而言,J2EE框架以其...

    JAVA开发疑难问题汇总

    资源名称:JAVA开发疑难问题汇总资源目录:【】10年程序员生涯总结:从C 到Java的几点思考【】50个必备的实用jQuery代码段【】5招教你把握Java性能监控【】J2EE基础:浅谈依赖注入实现的方法【】java-内部类那点事...

    浅谈Java三大框架与应用

    在J2EE环境中,Hibernate可以替代CMP(容器管理持久性),为开发者带来更灵活、高效的数据库访问方式。 在实际应用中,三大框架通常协同工作:Struts负责处理HTTP请求,呈现视图,同时调用Spring的业务层接口;...

Global site tag (gtag.js) - Google Analytics