`
a25765339
  • 浏览: 62504 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】EJB3事物

 
阅读更多
http://hi.baidu.com/javaweb20/item/e027e2159f51c638b831802a

EJB 3 事务管理探讨


EJB事务的特点:

提供声明式事务与编程式事务

声明式事务:应用程序只需要关心业务逻辑,由容器来负责事务的管理。这是实践中常用的方法。

编程时事务:应用程序编码人员自己写事务代码。

② EJB事务编程的类型

A、CMT    容器管理事务

B、BMT    Bean管理事务

C、Client-MT    Client-Controlled Transaction客户端管理事务

实体Bean只能用CMT。

CMT:

由容器实现的远程对象/拦截器,负责调用中间件服务。

优点:在应用程序代码中,不用编写事务服务代码;

缺点:粗粒度,只能在方法级别控制事务。



EJB Bean类中编程方式来使用事务(BMT):

优点:细粒度地控制事务

缺点:事务代理与业务代码纠缠

Client-controlled Transaction:

优点:客户端可以精确控制事务

缺点:可能会因为网络问题引起是事务的回滚。

3、EJB事务边界的划分

事务边界:事务边界是指事务从哪里开始。

CMT的事务特性:

Required:Bean类的方法必须要在事务环境下运行,这是容器默认的事务机制。

事务特性只能使用在CMT。

RequiredNew:Bean类中的方法必须在一个新的事务环境下运行。

Supports:Bean类的方法不需要支持事务。如果客户端有事务,则继续沿用原事务环境。

Mandatory:Bean类中方法必须要在事务环境下运行。客户端不启动事务则报错。

NoSupported:Bean类中方法不支持事务。如果客户端启动了事务,则挂起该事务。

Never:Bean类中的方法不支持事务。如果客户端启动了事务,则报错。

如果没有指定参数,@TransactionAttribute 注释使用REQUIRED 作为默认参数。

三、EJB事务的编程

1、CMT

    @TransationManagement 用在类前,标注该EJB事务管理方式为Bean | Container(默认)

    @TrasactionAttribute    用在方法前,标注事务特性(事务的边界)

    @SessionContext.setRollbackOnly() 回滚标识,setRollbackOnly()方法必须在事务环境下运行。

    EJB容器对于非受查异常(主要指RuntimeException)会回滚,事务对于受查异常则会提交事务。

2、BMT

UserTransaction:

① interface

② 提供控制事务的方法

③ 由容器实现,可以使用@Resource注入

    UserTransaction.begin()| commit()| .rollback()

3、客户端控制事务

调用EJB的方法,要求EJB必须采用CMT形式。

4、事务的隔离性

事务的隔离级别:

A、Read uncommitted:性能最高

B、Read committed:解决脏读问题

C、Repeatable read:解决重复读取问题

D、Serializable:解决幻读问题

EJB本身不提供隔离级别的设置,可以通过直接设置数据库(连接池)的隔离级别。

由于CMT依靠容器开始、提交和回滚事务,所以会限制事务的边界位置。而BMT则允许通过编程的方式来指定事务的开始、提交和回滚的位置。主要使用的是javax.transaction.UserTransaction接口。
例如:

如果使用有状态的Session Bean且需要跨越方法调用维护事务,那么BMT是你唯一的选择,当然BMT这种技术复杂,容易出错,且不能连接已有的事务,当调用BMT方法时,总会暂停已有事务,极大的限制了组件的重用。故优先考虑CMT事务管理。


@Stateless)    
@TransactionManagement(TransactionManagementType.BEAN)                                     
public class ManagerBean {    
    @Resource                                                          
    private UserTransaction userTransaction;                           
    
    public void placeSnagItOrder(Item item, Customer customer){    
        try {    
            userTransaction.begin();                                   
   
                validateCredit(customer);    
                ....
   
            userTransaction.commit();                                   
        } catch (CreditValidationException cve) {                      
            userTransaction.rollback();                                
        } catch (CreditProcessingException cpe){                      
            userTransaction.rollback();                               
        }
.....
    }    
}   
@TransactionManagement(TransactionManagementType.BEAN) 指定了事务的类型为BMT,上面没有用到@TransactionAttribute,因为它只适用于CMT,在上面代码中,可以显示的指定事务的开始与提交,因此更加的灵活。上面最关键的地方是注入了UserTransaction资源。其中获得UserTransaction资源的方式有三种,除了用EJB资源的方式注入以外,还有以下两种方式:
(1) JNDI查找


Context context = new InitialContext();    
UserTransaction userTransaction = (UserTransaction) context.lookup(“java:comp/UserTransaction”);    
userTransaction.begin();    
userTransaction.commit();  

如果在EJB之外,则可使用此方法,如在不支持依赖注入的JBoss4.2.2的Web工程或helper class即帮助器类中都可以。

(2)EJBContext


@Resource     
private SessionContext context;    
...    
UserTransaction userTransaction = context.getUserTransaction(); userTransaction.begin();       
userTransaction.commit();  

getUserTransaction方法只能在BMT中使用。如果在CMT中使用,则会抛出IllegalStateException异常。且在BMT中不能使用EJBContext的getRollbackOnly和setRollbackOnly方法,如果这样使用,也会抛出IllegalStateException异常。


@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void insertProduct(String name, Float price, boolean error) {



其中,@TransactionAttribute(TransactionAttributeType.REQUIRED)表示指定事务的类型。
如果省略,默认为CMT方式。
@TransactionAttribute(TransactionAttributeType.REQUIRED)通知容器如何管理事务,
事务的属性控制了事务的使用范围,因为事务之间的关系非常的复杂,这个属性主要是用来处理事务与事务之间怎样来处理的的问题。

如果产生一个系统异常,容器将自动回滚该事务。 EJBException是RuntimeException的子类,即也是一个系统运行时异常。
如果Bean抛出一个普通的非继承自RutimeException应用异常,事务将不会自动回滚,但可以
通过调用EJBContext的SetRollbackOnly回滚。 EJB上下文还有一个getRollbackOnly方法,通过返回一个boolean值来确定CMT事务是否已被标记为回滚。如果开始非常耗资源的操作前判断此bean的事务已被标记为回滚,则可以节约很多系统资源。
对于上面的异常回滚操作,还有一更加优雅的方式:
@ApplicationException(rollback=true)                                   
public class CreditValidationException extends Exception {             
@ApplicationException(rollback=true)                                   
public class CreditProcessingException extends Exception {            
//系统异常   
@ApplicationException(rollback=false)                                   
public class DatabaseException extends RuntimeException {   @ApplicationExcepti把JAVA核对与不核对的异常标识为应用程序异常。其rollback默认为false,表示程序不会导致CMT自动回滚。
分享到:
评论

相关推荐

    EJB_transaction(EJB事物)

    EJB事物详细讲解:TransactionAttributeType.MANDATORY;TransactionAttributeType.REQUIRED;TransactionAttributeType.REQUIRES_NEW;TransactionAttributeType.SUPPORTS;TransactionAttributeType.NOT_SUPPORTED...

    EJB实体Bean与事物管理

    3. **EJB事务属性** - **REQUIRED**: 默认属性,如果当前没有事务,容器会创建一个新的事务。 - **REQUIRES_NEW**: 创建一个新的事务,即使当前存在事务,新事务也会独立于当前事务运行。 - **MANDATORY**: 如果...

    POJO Application Frameworks_ Spring Vs. EJB 3

    EJB 3” 该标题与描述指出了一篇关于POJO(Plain Old Java Object)应用框架的文章,主要对比了Spring框架与EJB 3.0(Enterprise JavaBeans 3.0)。文章旨在深入探讨这两种框架在企业级Java应用程序开发中的应用,...

    EJB实体Bean学习

    3. **更新(Update)**:修改实体Bean的属性,然后调用`merge()`方法将更改同步到数据库。 4. **删除(Delete)**:使用`remove()`方法删除指定的实体Bean实例,这将触发数据库中的删除操作。 在CMPDemo中,你可能...

    (事物学习笔记二) 对Java事物的理解

    3. **容器管理的事务(CMT)**:在EJB环境中,容器自动管理事务,开发者无需关心事务细节。这在大型企业应用中常见,但增加了对特定技术的依赖。 4. **资源本地事务**和**全局事务(JTA)**:在分布式环境下,如果...

    Jboss事物处理

    这使得基于Spring的应用可以在Tomcat上运行的同时,享受与EJB容器类似的事务管理能力。 **Spring**是一个全面的Java应用开发框架,它的事务管理模块(Spring Transaction Management)提供了声明式和编程式的事务...

    事物管理javaweb.zip

    在"事物管理javaweb.zip"中,可能包含的详细内容有:JDBC事务示例代码、EJB事务配置、Spring事务管理的配置文件和注解使用、事务隔离级别的解释与选择、分布式事务的实现机制等。学习这些内容可以帮助开发者更好地...

    java 事物处理的资源

    3. **TransactionManager**: 这个接口提供了更高级别的事务控制,包括设置事务属性,如事务超时和恢复事务。通常,TransactionManager由应用服务器管理,并通过JNDI进行查找。 4. **XAResource**: 数据库驱动程序...

    Java EE架构师认证指南

    事物管理包括事物的创建、提交、回滚等阶段。 安全性 安全性是企业级应用程序的重要方面。Java EE 提供了一系列的安全机制,包括身份验证、授权、加密、数字签名等。安全性是保护企业级应用程序的关键。 国际化 ...

    最新整理神州数码面试题目

    3. **EJB(Enterprise JavaBeans):** - EJB是J2EE平台的一部分,主要用于构建企业级应用的组件模型。 - 它包括会话Bean、实体Bean和消息驱动Bean等不同类型,分别对应不同的业务需求。 ### 数据库技术与SQL 1....

    hibernate缓存和事务

    2. **JTA事务**:适合于应用服务器环境,Hibernate可以集成到EJB容器中,利用容器提供的全局事务管理。 ### Hibernate 查询 Hibernate 提供了多种查询方式: 1. **HQL(Hibernate Query Language)**:类似于SQL...

    CGB_面试题_第三阶段(1).docx

    优点在于能够实现全局事务的控制,通过 EJB CMT 进行事物的管理;缺点在于事务声明有编程式事物和申明式事物。 10. MyBatis 应用 MyBatis 是一个持久层框架,提供了动态 SQL 机制,可以解决固定的 SQL 语句不能...

    最新系统分析师复习资料-知识点分类总结(PDF)

    - **模型元素**:UML规定了四种事物表示法,包括结构事物、行为事物、分组事物和注释事物。 3. **OMT方法** - OMT(Object Modeling Technique)是一种面向对象的建模方法。 - **模型**:OMT方法中有三种模型:...

    java软件工程师面试题题集

    - **抽象**:通过抽象,我们可以专注于对象的主要功能,忽略不相关的细节,创建类来表示具体事物。 - **继承**:子类继承父类的属性和方法,实现代码的复用和类的层次结构。 - **封装**:隐藏对象的内部实现,只...

    Java+Web项目企业事务管理系统源码 (1)Java源码

    9. **EJB(Enterprise JavaBeans)**:在企业级应用中,EJB提供了一种标准的方法来创建可部署的、组件化的服务器端应用,处理事务、安全性、并发性和资源管理等复杂问题。 10. **Tomcat服务器**:Tomcat是Apache...

    Java相关技术(详细资料)

     3、Java RMI(Java Remote Method Invocation)用来开发分布式Java应用程序。一个Java对象的方法能被远程Java虚拟机调用。这样,远程方法激活可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用...

    java学习心得4000字.doc

    - **EJB**:尽管EJB3的发布对其有一定的冲击,但在某些领域仍具有优势。 4. **XML/CSS**: - **XML**:作为数据交换格式的一种,了解其基本语法即可。 - **CSS**:对于前端展示而言,了解基本的CSS知识足够日常...

Global site tag (gtag.js) - Google Analytics