J2EE事务 学习笔记 (1)

来源:互联网 发布:淘宝店铺活动有哪些 编辑:程序博客网 时间:2024/05/01 20:46

第一章 介绍

           Transaction的模型主要分为三种类型:

           1. Local Transaction Model - 顾名思义,本地事务模型并不是事务管理的框架,而是本地资源管理器(Local Resource Manager)。 资源管理器提供访问者需要的实际数据源。例如,数据库的资源管理器由数据库驱动以及DBMS实现; 对于JMS, 资源管理器主要通过特定的JMS Provider的Queue(Topic) Connection Factory 来实现。

           2. Programmatic Transaction Model - 这种模型利用了JTA和服务器底层事务服务实现来提供事务能力。在这种模型中,程序员通过代码来管理事务。主要是利用了javax.transaction.UserTransaction接口,使用begin() 方法启动一个事物,使用commit() 或者rollback()方法来终止事务。

           3. Declarative Transaction Model - 在声明式事务模式中,框架或者容器管理事务的启动和停止(如 commit(), rollback() 等). 开发者通过配置文件(EJB对应ejb-jar.xml, spring 对应ApplicationContext.xml) 通知框架或者容器当应用程序异常时rollback事务。

           4. 什么是ACID?

               a. Atomicity - 原子性意味着在一个单独的工作单元中,事务必须提交(Commit)或者回滚(Rollback)所有的更新操作。

               b. Consistency - 一致性是指在一个活动的事务中,数据库永远不会处于不一致的状态,也就是说在一个事务中数据库的所有的insert, update, delete操作都必须使用完整性约束,即使事务还没有提交。

               c. Isolation - 隔离性涉及到各个事物之间的交互等级。这个属性决定当其他数据访问同一个信息的时候如何保证未提交的更新操作。

               d. Durability - 事务的持久性意味着当接收到一个成功提交的事务时,必须保证事务被成功提交并且数据库或者JMS的更新操作被持久化,以防止系统失效带来的数据丢失。

             5. JTA和JTS

                 对于事务的有效管理,企业应用程序开发者不需要了解Java Transaction Service (JTS) 的具体细节,但是无论使用EJB还是Spring, 了解Java分布式事务流程还是有必要的。

                大多数java企业应用程序都使用JTA来进行事务管理。JTA是开发者用来管理事务的接口。而JTS是JTA的底层事务服务实现,大多数商业或者开源应用服务器都使用JTS来提供底层事务服务。JTA和JTS的关系类似JDBC和数据库driver的关系。

                JTS是CORBA OTS 1.1规范的java实现。Although JTS is not mandated by J2EE, it is mandatory for the interoperability of distributed transactions between hetergenous implementations. 由于JTA必须支持JTS和非JTS实现,所以从JTA接口当中很难精确的判断其功能性,比如JTS规范可以选择支持嵌入式事务,但是J2EE规范并不支持这一特性。

                 我们并不需要关系太多的接口,如果使用编程式事务模型,我们需要使用javax.transaction.UserTransaction接口,这个接口允许我们以编程的方式提交事务,回滚事务,查看事务状态等。如果使用EJB的声明式事务模型,我们主要会关注setRollbackOnly() 方法和EJBContext接口,还可以使用TransactionManager接口来启动,提交或者回滚事务。

       UserTransaction接口

  • begin() - 启动一个新的事务并且将事务与当前线程关联起来;如果一个事务已经和当前线程关联并且底层JTS实现不支持嵌套事务,会抛出NotSupportException.
  • commit() - 在编程事务模型中,使用此方法提交事务并且解除事务与当前线程的关联。XA(两阶段提交)中的情况将在后续的文章中详细阐述。
  • rollback() -  在编程事务模型中,使用此方法回滚当前线程的事务,并且解除事务与当前线程的关联。
  • getStatus() - 在编程事务模型中,使用此方法可以返回整型值,反映与当前线程相关联的事务的状态,javax.transaction.Status接口反映了这些整型值得含义。

       TransactionManager 接口

        在声明式事务模型中主要使用此接口,在编程式事务模型中,我们可以使用TransactionManager接口实现与UserTransaction接口同样的功能,但是除非我们需要手工suspend或者resume事务,一般首选UserTransaction接口。

  • javax.transaction.TransactionManager.suspend() - 此方法用来挂起与当前线程相关联的事务,并且返回当前事务的一个引用,如果没有与当前线程关联的事务,则返回null。如果我们需要执行一些与XA不兼容的代码或者存储过程,此方法非常有用。后续章节会详细论述这个方法。
  • javax.transaction.TransactionManager.resume() -  用来恢复先前挂起的事务,必须将以待恢复的transaction的引用作为参数。
  • javax.ejb.EJBContext.setRollbackOnly()  - 通知容器标识当前事务,当程序完成时回滚此事务。

         Status 接口

  • STATUS_ACTIVE
  • STATUS_COMMITTED
  • STATUS_COMMITING
  • STATUS_MARKED_ROLLBACK
  • STATUS_NO_TRANSACTION
  • STATUS_PREPARED
  • STATUS_PREPARING
  • STATUS_ROLLEDBACK
  • STATUS_ROLLINGBACK
  • STATUS_UNKNOWN

             加粗的状态是常用状态。

                   

 

 

 

原创粉丝点击