`

JavaEE 中的事务

阅读更多

1.资料

2.本地事务与分布式事务JOTM

  • 本地事务
    完全依赖于DB、JMS自身,,如直接调用jdbc中的conn.commit();这里没应用服务器什么事,所以也不支持多数据源的全局事务。
  • 分布式事务
    在JavaEE世界的事务在JTA、JTS规范和XA Sources之上实现。
    JTA是用户编程接口,JTS是服务器底层服务,两者一般由应用服务器自带实现,而 和JBoss Transaction是专门搞局抢生意的。
    XA Sources其实先于JavaEE而存在,JDBC driver必须有javax.sql.XADataSource接口的实现类,否则所谓二阶段提交就是个伪能力。
    JavaEE除了支持JDBC和JMS外,还引入了JCA模型。JCA可以说是目前唯一可移植的插入JavaEE事务的资源模型,因此像JDO这类框架/Server就是靠乖乖出自己的JCA连接器来参与JavaEE事务的。

3.编程式模型4.宣告式模型4.1 事务类型4.2 事务隔离级别4.3 关于Rollback4.4 关于Spring

    手工调用jdbc的connection事务方法和使用JTA接口都属于编程式开发,在EJB中叫BMT(Bean管理事务)。
    JTA最重要的接口就是UserTransaction和它的六个方法-begin,commit,rollback,getStatus,setRollbackonly,setTransactionTimeout。
    程序需要UserTransaction时可以从JNDI领取,不过JNDI名随应用服务器不同而不同。EJB3里可以直接用个@Resource注入。

    前面都是铺垫,这个才是主打的事务模型,如EJB的CMT(容器管理事务)和Sprin。

    其中EJB2.0,Spring1.0在部署描述符和applicationContext.xml中定义,而EJB3.0和Spring2.0则采用annotation。

     这里JavaEE与Spring的定义基本相同:

  • Required:如果Context中有事务就加入,没有就自己创建一个。(最常用设置)
  • Mandatory:永远加入一个事务。如果当前Context没有事务,抛出异常。(那些不打算自己负责rollback事务的方法,必须加入到别人的事务,由别人来控制rollback)
  • RequiresNew:永远新建一个事务。(那些不管别人如何,自己必须提交事务的方法,比如审计信息是一定要写的)
  • Supports:如果有事务就加入,如果没有就算了。永远不会创建新事务。(一般用于只读方法,不会主动创建事务,但如果当前有事务就加入,以读到事务中未提交的数据)
  • NotSupported:永远不使用事务,如果当前有事务,挂起事务。(那些有可能抛异常但异常并不影响全局的方法)
  • Never:不能在有当前事务的情况下调用本方法。(生人勿近?)

      可见,Required是默认的设置,Supports是只读方法的最佳选择。

  • ReadUncommited:本事务可以看到另一事务未提交的数据。脏读。
  • ReadCommited:本事务只可以看到另一事务已提交的数据。不可重复读。
  • RepeatableRead:可重复读。在一个事务内,第一次读到的数据,在本事务没有提交前,无论另一个事务如何提交数据,本事务读到的数据都是不变的。
  • Serializable:串行化,同时只有一个事务能读相同的数据。

    级别越低越安全效率也越低。隔离级别需要相关资源支持,如重复读在Oracle里会降级为ReadCommited。Spring里默认的Default级别完全看数据源的脸色行事。

    EJB里,想rollback只能sessionContext.setRollbackOnly(),或者抛出EJBException。(EJB3还可以annotation设置某些自定义Exception可以触发rollback)

    在Spring里,同样只会rollback unchecked exception(RuntimeExcption及子类),而checked exception(Exception及子类)是不会rollback的,除非你特别声明。

   @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW,rollbackFor = {MyException1.class,MyException2.class})

    因此所有在service层方法中用throws定义的Exception,都必须在事务定义中进行rollback设定。(请勿善忘)

    所有在service层方法中c被atch处理了的异常,又希望容器辅助rollback的话,必须重抛一个预定义的RuntimeException的子类。(请勿回望)

    Spring不希望编程式事务管理。
    Spring也不希望使用EJB CMT--CMT依赖于EJB而无法用于POJO,依赖于JTA全局事务对单数据源场景造成了浪费,而且rollback机制比较麻烦(必须为EJBException或手工setRollbackOnly())。
    因此Spring通过AOP实现了对POJO的整套宣告式事务体系;对jdbc,hibernate,jpa,jms等local数据源和JTA实现了统一的事务管理机制,而且支持本地资源与JTA在配置文件级的切换,而且改进了rollback机制。

   1)一个本地事务管理器:

<bean class="code-quote" id="&amp;lt;span"></bean>"transactionManager"
  class="org.springframework.orm.jpa.JpaTransactionManager">
  <property class="code-quote" name="&amp;lt;span">"entityManagerFactory" ref="entityManagerFactory" />
 </property>

   2)Spring就会把请求都转发到应用服务器的JTA对象上(注意此时数据源也需要改为用JNDI从应用服务器获取)。

<bean class="code-quote" id="&amp;lt;span"></bean>"myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

   3)应用服务器专有的类型的JTA事务管理器:

<bean class="code-quote" id="&amp;lt;span"></bean>"myTxManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/>

分享到:
评论
1 楼 Tian.Wang 2010-10-25  
隔 离 级 别
数据库的隔离级别(为了解决并发):
1. Read Unommited :未交先读。(使用很少)
2. Read Commited: 提交读 (大部分数据库都用此方式)
3. Repeatable Read: 可重复读
4. Serialiazble : 序列化读

脏读:未提交的数据,但是能看到数据。
存在不可重复读:在第一人读数据的同时 第2人修改了,刷新后第1人的数据跟原先不同。(未锁定的意思)
幻读:第1人在查看的同时 第2人录入记录,刷新后第一人能看到更多(未锁定)



读操作未提交(Read Uncommitted)完全没有事务隔离,最好不要采用。

可串行化(Serializable)是完全的事务隔离,不支持多事务并发,最好不要采用。



主要就是以下2种的选择:

读操作已提交(Read Committed)、 可重读(Repeatable Read)
这2种的主要区别在是否避免不可重复读,不可重复读的意思是:一个事务两次读同一行数据,可是这两次读到的数据不一样,就叫不可重读。如果一个事务在提交数据之前,另一个事务可以修改和删除这些数据,就会发生不可重读。
2位请根据自己接口的需要,增加不同的事务隔离级别,通过@Transactional的isolation属性配置事务隔离级别,如不需要可不配置isolation,isolation默认为采用数据库默认的事务隔离级别。

相关推荐

    JavaEE spring事务操作环境和基本功能搭建

    例如,银行转账操作就需要在一个事务中进行,确保钱从一个账户扣除的同时增加到另一个账户,即使中间出现错误,也能通过回滚事务来恢复原始状态。 Spring提供两种事务管理方式:编程式事务管理和声明式事务管理。...

    Javaee 中文开发文档

    9. **JTA(Java Transaction API)**:JTA定义了处理事务的接口和协议,确保在多组件环境中进行一致性的事务管理。 10. **JAX-RS(Java API for RESTful Web Services)**:JAX-RS是JavaEE提供的RESTful服务开发...

    javaee中核心jar包

    6. **JTA (Java Transaction API)**:JavaEE中的JTA提供了分布式事务管理服务,确保在多资源操作中的数据一致性。`javax.transaction`包包含了事务的开始、提交、回滚等操作,以及用户定义的事务边界。 7. **JMS ...

    javaee中文文档

    9. **JTA(Java Transaction API)**:JTA提供了事务管理服务,确保在分布式环境中数据的一致性和完整性。 10. **JAF(JavaBeans Activation Framework)**:JAF是处理MIME类型的工具,常用于电子邮件和文件传输。 ...

    javaEE 中文API.chm

    3. **EJB(Enterprise JavaBeans)**:EJB是JavaEE中用于构建可复用的、事务安全的企业级组件。EJB有三种类型:Session Beans(处理客户端会话),Message-driven Beans(处理JMS消息),以及Entity Beans(代表持久...

    Mysql 和javaee 中文说明文档

    MySQL和JavaEE是两个在IT领域中至关重要的技术,它们分别代表了数据库管理和企业级应用程序开发的基石。这篇中文说明文档旨在帮助初学者和进阶者深入理解这两个领域的核心概念和实践技巧。 MySQL是一个广泛使用的...

    javaee中文API.zip

    这个“javaee中文API.zip”压缩包很可能是包含了JavaEE平台中各个组件的中文版API文档。 JavaEE API文档是开发者的重要参考资料,它详细列出了JavaEE各组件的接口、类、方法以及使用示例,帮助开发者理解如何与这些...

    javaee大作业实例

    9. **JTA(Java Transaction API)**:处理分布式事务的API,确保在多组件操作中的数据一致性。 10. **JMS(Java Message Service)**:JavaEE的消息传递系统,用于异步通信和解耦应用组件。 这个"javaee大作业...

    JAVAEE 5 中文文档内部版

    8. **JSF(JavaServer Faces)**:JSF是一个用于构建用户界面的MVC框架,JAVAEE 5中的JSF 1.2引入了组件化开发和Facelets视图技术,提升了开发效率。 由于当前文档是内部未成品版,可能无法直接阅读,但你可以通过...

    javaee中文api

    JavaEE(Java Platform, Enterprise Edition)是Java平台上用于构建企业级应用的标准规范,它由一组技术模块组成,涵盖了网络服务、分布式计算、数据库交互、安全、事务管理等多个方面。JavaEE中文API则提供了这些...

    简单的javaee大作业

    7. **JTA(Java Transaction API)**:JavaEE支持事务管理,JTA定义了如何在分布式环境中处理事务的一致性和隔离性。在简单项目中,可能涉及到单个数据库的本地事务管理。 8. **MVC架构模式**:模型-视图-控制器...

    JavaEE的Spring JDBC与事务管理 实验

    其操作流程是获取书的单价-&gt;买书(更新库存)-&gt;更新账户余额,在BookShopDaoImp中实现该方法,并使用基于XML和Annotation的声明式事务管理来确保该购书过程能正常执行(这时(1)中的方法都不需进行合法性判断,...

    JavaEE期末复习模拟题

    4. **EJB(Enterprise JavaBeans)**:EJB是JavaEE中的核心组件,用于构建分布式、事务处理和多层架构的企业级应用。有三种类型的EJB:Session Beans(会话bean)、Message-driven Beans(消息驱动bean)和Entity ...

    JAVAEE 中英对照

    6. **EJB (Enterprise JavaBeans)**: EJB是JAVAEE中的企业级组件模型,用于构建可复用的、分布式的、事务处理的服务器端应用程序。EJB包括三种类型:Session Beans、Message-driven Beans和Entity Beans,分别对应...

    javaEE7与javaSE6中文chm文档

    它提供了一系列API和服务,用于构建分布式、多层的企业系统,包括Web服务、事务处理、数据访问、并发控制等。相对的,Java SE 6(Java Standard Edition 6)则是Java的桌面和服务器端运行环境,提供了基础的Java编程...

    JAVAEE_api_中英文对照版

    此压缩包“JAVAEE_api_中英文对照版”提供了一个宝贵的资源,帮助开发者理解和使用Java EE中的各种组件和接口。 在Java EE API中,最重要的部分包括: 1. **Servlet**:Servlet是Java编程语言中的一个接口,用于...

    JAVAEE中文版(最新)

    这个"JAVAEE中文版(最新)"压缩包提供的是JavaEE的中文版API文档,对于那些在学习和开发过程中需要频繁查阅API的开发者来说,无疑是一个非常实用的资源。 JavaEE API包含了众多用于构建分布式、多层的企业级应用...

    javaee课程源代码

    6. **JTA(Java Transaction API)**:JavaEE支持分布式事务处理,JTA定义了事务管理的接口,确保在多组件操作中的一致性和完整性。 7. **JSF(JavaServer Faces)**:JSF是一种MVC(Model-View-Controller)框架,...

    javaee中文API

    3. **EJB(Enterprise JavaBeans)API**:EJB是JavaEE中的企业级组件模型,提供了用于构建可部署在服务器上的业务逻辑组件的标准。EJB有三种类型:Session Beans(用于表示业务逻辑)、Message-driven Beans(用于...

    JavaEE7 API 文档

    这个API文档包含了JavaEE7中的所有核心组件和技术规范,为开发者提供了详尽的接口、类和方法的说明,是开发JavaEE应用的重要参考资料。 JavaEE7的主要组成部分包括: 1. **Servlet 3.1**:这是JavaEE7中用于处理...

Global site tag (gtag.js) - Google Analytics