`

ejb事务管理(转)

    博客分类:
  • EJB
 
阅读更多
一、前言
    在语音门户的开发过程中,出现了在发生异常的情况下事务没有正确会滚,导致数据的不一致型,在分析过程中发现是由于在处理异常方法不正确导致,所抛出的异常未能使事物回滚,那么怎样处理异常才能正确使事物回滚,下面将就EJB中的事务管理做出一些说明
二、EJB中事务处理的两种方式
在EJB中处理事务有两种方式,一种是由容器管理事务,一种是由Bean管理事务,在任何Bean中都可以使用容器管理事务,会话Bean和消息驱动Bean可以使用Bean管理事务,实体Bean不能使使用Bean管理事务。
(一)、容器管理事务
     容器管理事务简化了开发,因为企业Bean不用编码来显式制定事务界限。代码不包括开始结束事务的语句。典型的,容器会在一个企业Bean的方法被调用前立即开始一个事务,在这个方法退出以前提交这个事务。每个方法都关联一个事务。在一个方法中不允许嵌套或多个的事务存在。容器管理事务不需要所有的方法都关联事务。当部署一个Bean时,通过设定部署描述符中的事务属性来决定方法是否关联事务和如何关联事务
1、    事务的属性
一个事务的属性控制了事务的使用范围。图 1-1说明了为什么控制事务的范围很重要。图中,method-A开始一个事务然后调用Bean-2中的method-B.它运行在method-A开始的事务中还是重新执行一个新的事务?结果要看method-B中的事务属性

图 1-1
一个事务属性可能有下面的属性之一:
☆ Required
☆ RequiresNew
☆ Mandatory
☆ NotSupported
☆ Supports
☆ Never
Required
如果客户端正在一个运行的事务中调用一个企业Bean的方法,这个方法就在这个客户端的事务中执行。如果客户端不关联一个事务,这个容器在运行该方法前开始一个新的事务。
Required属性在许多事务环境中可以很好的工作,因此你可以把它作为一个默认值,至少可以在早期开发中使用。因为事务的属性是在部署描述符中声明的,在以后的任何时候修改它们都很容易。
RequiresNew
如果客户端在一个运行的事务中调用企业Bean的方法,容器的步骤是:
1.挂起客户端的事务
2.开始一个新的事务
3.代理方法的调用
4.方法完成后重新开始客户端的事务
 如果客户端不关联一个事务,容器运行这个方法以前同样开始一个新的事务。如果你想保证该方法在任何时候都在一个新事物中运行,使用RequiresNew属性。
Mandatory
 如果客户端在一个运行的事务中调用企业Bean的方法,这个方法就在客户端的事务中执行。如果客户端不关联事务,容器就抛出TransactionRequiredException 异常。
如果企业Bean的方法必须使用客户端的事务,那么就使用Mandatory属性。
NotSupported
 如果客户端在一个运行的事务中调用企业Bean的方法,这个容器在调用该方法以前挂起客户端事务。方法执行完后,容器重新开始客户端的事务。
 如果客户端不关联事务,容器在方法运行以前不会开始一个新的事务。为不需要事务的方法使用NotSupported属性。因为事务包括整个过程,这个属性可以提高性能。
Supports
 如果客户端在一个运行的事务中调用企业Bean的方法,这个方法在客户端的事务中执行,如果这个客户端不关联一个事务,容器运行该方法前也不会开始一个新的事务。因为该属性使方法的事务行为不确定,你应该谨慎使用Supports属性。
Never
 如果客户端在一个运行的事务中调用企业Bean的方法,容器将抛出RemoteException异常。如果这个客户端不关联一个事务,容器运行该方法以前不会开始一个新的事务。
Summary of Transaction Attributes(事务属性概要) 
  表 1-1 列出了事务属性的影响。事务T1和T2都被容器控制。T1是调用企业Bean方法的客户端的事务环境。在大多数情况下,客户端是其它的企业 Bean。T2是在方法执行以前容器启动的事务。在表 1-1中,“None”的意思是这个商业方法不在容器控制事务中执行。然而,该商业方法中的数据库操作可能在DBMS管理控制的事务中执行。
Setting Transaction Attributes (设定事务属性)
 因为事务属性被保存在配置描述符中,他们会在J2EE应用程序开发的几个阶段被改变:创建企业Bean,应用程序装配和部署。然而, 当创建这个Bean的时候指定它的属性是企业Bean开发者的责任。只有将该组件装配到一个更大的应用程序时可以由开发者修改该属性,而不要期待J2EE应用程序部署者来指定该事务属性。
表 1-1 事物属性和范围
事务属性    客户端事务    商业方法事务
Required    None    T2
    T1    T1
RequiresNew    None    T2
    T1    T2
Mandatory    None    error
    T1    T1
NotSupported    None    None
    T1    None
Supports    None    None
    T1    T1
Never    None    None
    T1    Error 
  你可以为整个企业Bean或者单个方法指定事务属性。如果你为整个企业Bean和它某个方法各指定一个事务属性,为该方法指定的事务属性优先。当为单个方法指定事务属性时,不同类型企业Bean的要求也不同。会话Bean需要为商业方法定义属性属性,但create方法不需要定义事务属性。实体Bean需要为商业方法、create方法、remove方法和查找(finder)方法定义事务属性。Message-driven Bean需要为 onMessage方法指定属性事务,而且只能是Required和NotSupported其中之一。
(二) 、容器管理事务的回滚
在以下两中情况下,事务将回滚。
第一,    如果产生一个系统异常,容器将自动回滚该事务。
系统异常是指应用程序的支撑服务出现异常。这样的异常例子有:不能得到数据库连接,数据库满造成SQL语句插入失败,一个lookup方法找不到需要的对象等等。如果企业Bean遇到一个系统级的问题,它将抛出javax.ejb.EJBException,容器会把该异常包装到一个 RemoteException异常中返回给客户端。因为EJBException是RutimeException的子类,所以你不需要将它列在 throws子句中。当一个系统异常发生时,EJB容器可能会销毁企业Bean实例,因此系统异常不能被客户端处理,它需要系统管理员的干涉
第二,    由于EJBException作为系统异常,他继承自RutimeException,所以经过验证表明当抛出一个继承自 RutimeException的自定义异常时EJB容器也会自动回滚该事务,抛出普通的继承自Exception的应用程序异常容器不回自动回滚该事务
第三,    通过调用EJBContext接口SetRollbackOnly方法,Bean方法通知容器回滚该事务。如果Bean抛出一个普通的非继承自RutimeException应用异常,事务将不会自动回滚,但可以调用SetRollbackOnly回滚。例如
public class serviceRegBean implements SessionBean {
    SessionContext sessionContext;
    public void ejbCreate() throws CreateException {
    }
    public void ejbRemove() {
    }
    public void ejbActivate() {
    }
    public void ejbPassivate() {
    }
    public void setSessionContext(SessionContext sessionContext) {
        this.sessionContext = sessionContext;
    }
    public void updateData() throws   ThirdgsException {
        try {
           //更新操作一
           //更新操作二
        }
        catch (Exception ex) {
            //发生异常回滚事务
            sessionContext.setRollbackOnly();
            ex.printStackTrace();
            throw new ThirdgsException();
        }
    }
}
其中的ThirdgsException为继承自Exception的异常
(三) 、Bean管理事务
容器管理事务不支持嵌套事务,Bean管理事务支持嵌套事务,所以需要嵌套事务时可以采用Bean管理事务,使用Bean管理事务需要我们显式的设置事务的属性,需要我们自己编码管理事务,我门可以采用下面两种方式在Bean中管理事务
1、JDBC事务
JDBC 事务通过DBMS事务管理器来控制。你可能会为了使用会话Bean中的原有代码而采用JDBC事务将这些代码封装到一个事务中。使用JDBC事务,要调用 java.sql.Connection接口的commit和rollback方法。事务启动是隐式的。一个事务的从最近的提交、回滚或连接操作后的第一个SQL的语句开始。(这个规则通常是正确的,但可能DBMS厂商的不同而不同),例如
public void ship (String productId, String orderId, int quantity) {
try {
      //需要通知DBMS不要自动提交每个SQL语句
      con.setAutoCommit(false);
      updateOrderItem(productId, orderId);
      updateInventory(productId, quantity);
      con.commit();

   } catch (Exception ex) {
       try {
          con.rollback();
          throw new EJBException("Transaction failed: " +
             ex.getMessage());
       } catch (SQLException sqx) {
           throw new EJBException("Rollback failed: " +
              sqx.getMessage());
       }
   }
}
2、JTA事务
    JTA 是Java Transaction API 的缩写。这些API 允许你用独立于具体的事务管理器实现的方法确定事务界限。J2EE SDK 事务管理器通过Java事务服务(Java Transaction Service, JTS)实现。但是你的代码并不直接调用JTS中的方法,而是调用JTA 方法来替代,JTA方法会调用底层的JTS实现。
    JTA事务被J2EE 事务管理器管理。你可能需要使用一个JTA事务,因为它能够统一操作不同厂商的数据库。一个特定DBMS的事务管理器不能工作在不同种类的数据库上。然而J2EE事务管理器仍然有一个限制??它不支持嵌套事务。就是说,它不能在前一个事务结束前启动另一个事务。
??要自己确定事务界限,可以调用 javax.transaction.UserTransaction接口的begin、commit和rollback方法来确定事务界限(该接口只能在SessionBean中使用,实体Bean不允许使用用户自定义的)。下面选自TellerBean类的代码示范了UserTransaction的用法。begin和commit方法确定了数据库操作的事务界限,如果操作失败则调用rollback回滚事务并抛出EJBException异常。

public void withdrawCash(double amount) {
UserTransaction ut = context.getUserTransaction();
try {
      ut.begin();
      updateChecking(amount);
      machineBalance -= amount;
      insertMachine(machineBalance);
      ut.commit();
   } catch (Exception ex) {
       try {
          ut.rollback();
       } catch (SystemException syex) {
           throw new EJBException
              ("Rollback failed: " + syex.getMessage());
       }
       throw new EJBException
          ("Transaction failed: " + ex.getMessage());
    }
}
三、总结
以上是我在工作中遇到问题后,查阅资料后,结合资料和实践作出的一些总结,如果有谬误之处,望指出,大家一起探讨,谢谢!
分享到:
评论

相关推荐

    EJB与事务 -详细描述EJB和事务

    在EJB中,事务管理是核心功能之一,确保了数据的一致性和完整性。事务是数据库操作的基本单元,确保一组操作要么全部成功,要么全部失败,避免数据的不一致。 事务的界定是定义事务的生命周期,包括开始、挂起、...

    EJB的事务属性

    总之,EJB的事务属性是Java EE平台为企业级应用提供的重要特性之一,它简化了事务管理,使开发人员能够专注于核心业务逻辑,而不必担心底层的事务控制细节。通过合理配置这些属性,可以显著提高应用程序的性能、可靠...

    ejb3.0 分布式事务

    EJB3.0中,事务管理分为容器管理的事务(CMT, Container-Managed Transactions)和 bean 管理的事务(BMT, Bean-Managed Transactions)。CMT是默认模式,由容器自动管理事务的开始、提交、回滚,开发者只需关注...

    EJB3-JBOSS7-分布式事务示例

    4. **容器管理的事务**:EJB3支持自动事务管理,可以通过`@TransactionAttribute`来定义事务的传播行为和隔离级别。 **JBoss AS7 (现为WildFly)** 是一个开源的应用服务器,它是EJB3规范的一个实现,提供了运行和...

    EJB实体Bean与事物管理

    **EJB实体Bean与事务管理** 企业级JavaBean(Enterprise JavaBeans,简称EJB)是Java平台上的一个核心组件,用于构建可部署在服务器端的分布式应用程序。在EJB规范中,实体Bean(Entity Bean)是一种特殊类型的组件...

    EJB方面 ejb pdf

    通过深入理解EJB的特性、生命周期和事务管理机制,开发者可以更好地设计和构建高性能、高可用性的企业级应用。同时,对比JavaBean,EJB在分布式环境下的优势明显,是构建大型、复杂系统的优选技术方案。

    ejb之实体Bean与cloudscape数据库事务处理代码

    但这通常是作为最后手段,因为声明式事务管理更符合EJB的无状态原则。 二、CLOUDSCAPE数据库 Cloudscape是一种早期的关系型数据库管理系统,它支持Java数据库连接(JDBC)。在J2EE 1.3环境中,实体Bean通常通过JDBC...

    ejb实现的超市管理系统

    1. **事务管理**:EJB支持ACID事务,确保数据的一致性和完整性。 2. **安全性**:EJB提供内置的安全模型,可以限制对特定资源的访问,确保只有授权的用户和bean才能进行操作。 3. **可扩展性**:EJB可以在多服务器...

    实战EJB 实战EJB 实战EJB

    通过将业务逻辑与基础架构关注点(如事务管理、安全性、持久性和并发控制)分离,EJB允许开发者专注于核心业务逻辑的实现,而将非功能性的复杂性交由容器来处理。 **EJB体系结构** EJB体系结构主要包括三个主要...

    EJB容器对bean的管理

    EJB容器在运行时提供了多种服务,如安全性、事务管理、生命周期管理以及资源管理等。以下将详细探讨EJB容器对bean的管理机制。 **实例池化** 实例池是EJB容器管理bean资源的一种策略,它类似于数据库连接池。通过...

    EJB白皮书EJB白皮书

    EJB规范定义了一套标准,允许开发者创建可复用、安全且事务管理的业务逻辑组件,这些组件可以无缝集成到Java应用服务器中。本篇将深入探讨EJB 3.0版本,该版本引入了许多改进,简化了API,提高了开发效率。 **EJB ...

    图书馆管理系统代码(Ejb3.0)

    4. **简化事务管理**:EJB3.0提供了一种更简单的事务管理方式,通过注解如`@TransactionAttribute`来控制事务的属性和行为。 5. **查询语言**:EJB3.0引入了JPQL(Java Persistence Query Language),这是一种面向...

    ejb spring

    2. **Spring AOP与ejb事务管理**:Spring的声明式事务管理可以与ejb的事务管理相结合,提供更细粒度的事务控制。 3. **Spring与ejb的协作**:在某些场景下,会话bean可能只负责协调工作,而具体的业务逻辑由Spring...

    EJB_TEST自己编写的EJB例子

    **EJB(Enterprise ...综上所述,EJB_TEST是一个帮助学习者理解和实践EJB技术的示例项目,涵盖了EJB的基本概念、组件类型、生命周期、部署、通信、事务管理和安全性等方面,是深入理解Java企业级开发的宝贵资源。

    Weblogic Ejb 学习笔记

    - 事务管理是EJB的关键特性,WebLogic支持声明式和编程式事务控制,可配置不同的事务隔离级别和回滚规则。 7. **EJB的持久性和状态管理** - 对于Entity Beans,WebLogic Server提供了容器管理的持久性(CMP)和...

    图书管理系统(strtust+EJB)

    通过EJB的事务管理,可以确保在并发环境下数据的一致性和完整性。 在实现过程中,可能涉及到的技术包括Hibernate作为ORM(对象关系映射)工具,将Java对象和数据库表进行映射,简化数据访问;Spring框架可能作为...

    spring事务管理5种方法

    在EJB或JTA环境中,Spring也可以作为容器的一部分,利用JTA(Java Transaction API)进行全局的分布式事务管理。这种方式适用于多数据源环境,能处理跨越多个数据库的事务。 5. 自动事务管理: Spring在某些特定...

    EJB基础(学习EJB者必看)

    事务管理是另一个关键特性,EJB支持声明式事务(Declarative Transactions),只需在接口或方法上添加注解,即可指定事务边界。 Javabean技术则是EJB的一个基础,javabean是一种符合特定规范的Java类,它具有属性、...

    EJB3 PPT教程

    EJB3的bean默认支持声明式事务管理,即通过注解如`@TransactionAttribute`来定义事务的边界和策略。 通过这个PPT教程,你将全面了解EJB3的各种组件和它们在实际开发中的应用。理解并掌握这些知识点,你就能更有效地...

Global site tag (gtag.js) - Google Analytics