`

EJB3 事务管理

    博客分类:
  • EJB3
阅读更多
事务分本地事务和分布式事务,本地事务相对简单,这里讨论一下分布事事务。
分布式环境如何管理涉及一个以上资源的事务呢?主要是通过被称为两阶段
提交(two-phase commit)来实现的。在执行一个以上的数据库操作时,如果第一个数据库操作成功,第二个数据库操作失败,要回滚第一个操作是非常困难的。所以在提交事务之前,两阶段提交协议会询问每个资源管理器的当前事务能否提交成功,如果任何一个资源管理器表示不能提交事务,那么就回滚整个事务。

EJB有两种使用事务的方式。
第一种方式通过容器管理的事务,叫CMT,另一种通过bean管理的事务叫BMT。

在CMT中,容器自动提供事务的开始、提交和回滚。总是在业务方法的开始和结束处标记事务的边界。下面以ejb3 in action上的例子说明:

@Stateless 
@TransactionManagement(TransactionManagementType.CONTAINER) 
public class OrderManagerBean { 
    @Resource                                                 
    private SessionContext context;                      
… 
@TransactionAttribute(TransactionAttributeType.REQUIRED)                            

    public void placeSnagItOrder(Item item, Customer customer){ 
        try { 
            if (!bidsExisting(item)){ 
                validateCredit(customer); 
                chargeCustomer(customer, item); 
                removeItemFromBidding(item); 
            } 
        } catch (CreditValidationException cve) {                   
            context.setRollbackOnly();                              
        } catch (CreditProcessingException cpe){                    
            context.setRollbackOnly();                              
        } catch (DatabaseException de) {                            
            context.setRollbackOnly();                             
        }                                                          
    } 
} 


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

如果产生一个系统异常,容器将自动回滚该事务。 EJBException是RuntimeException的子类,即也是一个系统运行时异常。
如果Bean抛出一个普通的非继承自RutimeException应用异常,事务将不会自动回滚,但可以
通过调用EJBContext的SetRollbackOnly回滚。
当然EJB上下文还有一个getRollbackOnly方法,通过返回一个boolean值来确定CMT事务是否已被标记为回滚。如果开始非常耗资源的操作前判断此bean的事务已被标记为回滚,则可以节约很多系统资源。
对于上面的异常回滚操作,还有一更加优雅的方式:


public void placeSnagItOrder(Item item, Customer customer) 
    throws CreditValidationException, CreditProcessingException,     
        DatabaseException {                                          
    if (!bidsExisting(item)){                                       
        validateCredit(customer);                                    
        chargeCustomer(customer, item);                             
        removeItemFromBidding(item); 
    }                                                               
} 
... 
@ApplicationException(rollback=true)                                
public class CreditValidationException extends Exception {          
... 
@ApplicationException(rollback=true)                                
public class CreditProcessingException extends Exception {         
... 
//系统异常
@ApplicationException(rollback=false)                                
public class DatabaseException extends RuntimeException { 


@ApplicationException把JAVA核对与不核对的异常标识为应用程序异常。其rollback默认为false,表示程序不会导致CMT自动回滚。
但应用程序异常应当慎用,见下文:

If the container detects a system exception, such as an  ArrayIndexOutOfBounds or
NullPointerException that you did not guard for, it will still roll back the CMT transaction.
However, in such cases the container will also assume that the Bean is in inconsistent state and will
destroy the instance. Because unnecessarily destroying Bean instances is costly, you should never
delibertely use system exceptions.


2.bean管理事务

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

如下面代码:

@Stateless) 
@TransactionManagement(TransactionManagementType.BEAN)                                  
public class OrderManagerBean { 
    @Resource                                                       
    private UserTransaction userTransaction;                        
 
    public void placeSnagItOrder(Item item, Customer customer){ 
        try { 
            userTransaction.begin();                                
            if (!bidsExisting(item)){ 
                validateCredit(customer); 
                chargeCustomer(customer, item); 
                removeItemFromBidding(item); 
            } 
            userTransaction.commit();                                
        } catch (CreditValidationException cve) {                   
            userTransaction.rollback();                             
        } catch (CreditProcessingException cpe){                   
            userTransaction.rollback();                            
        } catch (DatabaseException de) {                          
            userTransaction.rollback();                        
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
} 



@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(); 
// Perform transacted tasks. 
userTransaction.commit(); 


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

(2)EJBContext

@Resource  
private SessionContext context; 
... 
UserTransaction userTransaction = context.getUserTransaction(); userTransaction.begin(); 
// Perform transacted tasks. 
userTransaction.commit(); 


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



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

相关推荐

    EJB3开发指南《EJB.3.Developer.Guide》

    EJB3开发指南英文版《EJB.3.Developer.Guide》 出版商:PacketPublishing 出版日期:2008年5月 页数:276 简介: 第一章:EJB3体系结构简介 第二章:Session Beans 第三章:实体Entities 第四章:对象关系映射ORM 第...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    4.4 EJB的事务管理 201 4.4.1 容器管理事务(CMT) 201 4.4.2 Bean管理事务(BMT) 201 4.5 事务超时设置 201 4.6 本章小结 203 第5章 JNDI和远程方法调用 204 5.1 JNDI的概念 205 5.1.1 命名服务 205 5.1.2 目录服务 ...

    EJB 3.0从入门到精通

    全书共分16章,内容依次包含了Java EE概述、EJB基础、搭建EJB环境、会话bean、持久化实体、持久化实体管理器、对象关系映射、JPQL查询、消息驱动bean、事务、提高EJB 3.0性能、从Web层访问EJB 3和EJB安全、EJB和Web...

    ejb3.0培训教程与源码(绝对精品)

    3)资源管理和组件的声明周期的管理; 4)远程的调用:屏蔽了很多细节 5)并发请求 ( EJB都是单线程的 ); 不要在EJB的代码中写多线程的代码; 6)集群 7)负载均衡 5, EJB的类型 1) 会话Bean: 实现业务逻辑 有状态...

    Java中各种事务管理技术的总结

    内容包括事务及其控制的基本概念,Oracle中的事务处理,以及JDBC,EJB,JTA事务管理内容的总结,最后还介绍了事务管理的技巧,是了解和学习JAVA事务处理不可多得的第一手资料!

    oracle-mysql 两阶段提交例子(ejb3)

    ejb3事务分容器管理事务(CMT)和Bean管理事务(BMT),这里讲述了CMT情况下,两阶段提交例子(tow-phase commit),展示ejb容器为我们做的事情,其实就是ejb容器提供商,已经帮开发者解决了的问题。数据库分别是oracle...

    Weblogic EJB 学习笔记

    Weblogic EJB 学习笔记 ejb 基础知识 EJB 组成 EJB 配置描述器 建立ejb 档案文件 容器管理的事务 ejb 引用

    EJB3.0实录教程+配套源码

    ejb3.0培训教程与源码 #######含真正配套源码 .................... ...3)资源管理和组件的声明周期的管理; 4)远程的调用:屏蔽了很多细节 5)并发请求 ( EJB都是单线程的 ); 不要在EJB的代码中写多线程的代码;

    名片管理(EJB3.0)

    使用EJB3.0开发的,支持分布式管理和事务控制,想学EJB3.0的朋友可以下载下来看看,很有帮助

    EJB中的JTA与JTS例子代码

    JTS则规定了支持JTA的事务管理器的实现规范,在高层API之下实现了OMG Object Transaction Service(OTS) 1.1规范的Java映射。JTS使用Internet Inter-ORB Protocol(IIOP)来传播事务。本例子将介绍JTA与JTS在具体应用中...

    Wicket6.7_Spring3.2_Hibernate4.2_EJB全注解实例

    Wicket6.7 Spring3.2 Hibernate4.2 EJB全注解实例.采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。

    达内java软件工程师培训ejb的PPT

    EJB 在大型系统中的应用包括远程方法调用、负载均衡、透明的故障转移、后端集成、事务处理、集群、动态重新部署、清洁关闭、日志记录和审核、系统管理、线程处理、消息队列、对象生命周期管理、资源池、安全性和缓存...

    EJBContainer:EJB 容器的个人实现

    每个事务都与打开它的线程的标识符相关联,以保证事务管理器的线程安全操作。 使用@PersistenceContext 注释的实体管理器注入。 然后,管理器使用事务管理器来检索当前事务并在那里执行其操作。 管理 EJB 初始化...

    Java EJB JTA JTS用法示例源代码.rar

    JTS则规定了支持JTA的事务管理器的实现规范,在高层API之下实现了OMG Object Transaction Service(OTS) 1.1规范的Java映射。JTS使用Internet Inter-ORB Protocol(IIOP)来传播事务。  本源码包中的例子将介绍JTA与...

    11.事务——为服务器端增加JTA事务管理功能

    Java Web即Java EE,它是面向企业级的网络系统,其中的“企业级”和“网络”...在Java EE最新的规范中提供了进行企业级开发的框架组件EJB,并同时提供了多种分布式服务开发技术方案,以及多种企业应用的业务解决方案。

    ejb的详细介绍

    3. 透明的失败恢复 客户端不会发现 4. 后台继承(JCA) JCA软件能做到java程序调用非java程序 5. 分布式事务 6. 动态重部署 7. 无损关机(服务器停掉的时候保证没有客户) 8. 登陆和授权 9. 系统管理(当软件有问题时能够...

    实战EJB之三 开发会话Bean(有状态会话Bean).doc

    在部署到应用服务器时,需要配置ejb-jar.xml文件,以便容器可以正确地识别和管理Bean的生命周期。 6. 开发和部署测试程序 开发和部署测试程序需要使用J2EE服务器提供的API和工具,如EJB容器、JNDI、JMS等。 7. ...

    基于TCC机制的分布式事务管理器源代码

    ByteTCC是一个基于TCC(Try/Confirm/Cancel)机制的分布式事务管理器。兼容JTA,可以很好的与EJB、Spring等容器(本文档下文说明中将以Spring容器为例)进行集成。

    Java编程语言中EJB技术的详细说明

    Enterprise JavaBean (EJB) 1.1 规范定义了开发和部署基于事务性、分布式对象应用程序的服务器端软件组件的体系结构。企业组织可以构建它们自己的组件,或从第三方供应商购买组件。这些服务器端组件称作 Enterprise ...

    Java事务设计策略.

    事务管理应该被包含在开始该事务的方法中. 因此,应该只让那些开启了新事务的方法去调用setRollbackOnly(). 如果一个方法需要一个事务环境但不负责对事务进行回滚的话,该方法应该使用Mandatory事务属性. X/Open XA...

Global site tag (gtag.js) - Google Analytics