`

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
分享到:
评论

相关推荐

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

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

    spring with ejb3

    2. **EJB 3事务管理**:EJB 3容器自动管理事务,通过`@TransactionAttribute`注解可以控制事务属性。 **EJB 3与Spring的安全性** 1. **Spring Security**:Spring Security提供了一套全面的身份验证和授权机制,...

    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规范的一个实现,提供了运行和...

    ejb3 带源码

    - **分布式事务处理**:EJB3支持分布式事务,可以跨多个资源管理器协调事务操作。 - **集群与高可用**:EJB3允许在集群环境中部署,提高系统的可用性和可伸缩性。 - **安全性**:EJB3提供了基于角色的访问控制...

    EJB3 PPT教程

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

    EJB3基础教程

    EJB3中的容器管理的事务(CMT)允许开发者无需关心事务的开始、提交或回滚,这些都由EJB容器自动处理。开发者只需在方法上添加`@TransactionAttribute`注解来指定事务的属性。 ### 6. 容器服务 EJB3提供了一系列的...

    EJB实体Bean与事物管理

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

    EJB3开发Entity

    EJB3提供自动的事务管理,开发者可以通过注解来控制事务的边界,例如`@TransactionAttribute(TransactionAttributeType.REQUIRED)`。 6. **查询语言JPA QL** JPA提供了自己的查询语言——JPA Query Language...

    EJB3(入门经典简版)

    企业级JavaBeans(EJB)是Java平台上用于构建可扩展、安全且事务管理的企业级应用程序的核心技术。EJB3是EJB规范的一个重大改革版本,引入了许多简化开发的新特性,使得Java开发者能够更高效地构建分布式企业应用。 ...

    ejb3进阶案例

    ejb3的实体管理器提供了事务管理和懒加载等功能,大大提高了开发效率。 **3. MessageDriven Bean** MessageDriven Bean(消息驱动Bean)是ejb3中的一个特殊类型,主要用于处理JMS(Java Message Service)消息。...

    EJB3应用实例

    1. **注解驱动**:EJB3摒弃了EJB2.x中的XML配置,大量使用Java注解来声明bean的角色、事务属性、安全角色等,大大减少了部署描述符的编写工作。 2. **无状态会话bean(Stateless Session Beans,SSB)**:这类bean...

    EJB3入门例子

    JBoss AS5提供了丰富的管理和监控工具,方便开发者部署和调试EJB3应用。 **myEclipse**是一款集成开发环境,特别适合Java EE应用的开发,包括EJB3项目。它集成了众多开发工具,如代码编辑器、调试器、部署工具等,...

    EJB 3实战 带书签

    EJB容器提供了一组服务,如事务管理、安全性、远程访问和生命周期管理等,开发者可以很轻松地在不编写额外代码的情况下使用这些服务。此外,EJB 3还引入了无状态会话Bean和有状态会话Bean这两种类型的Bean,分别用于...

    EJB3 入门经典 源码

    8. **事务管理(Transaction Management)**:EJB容器提供了自动事务管理,开发者无需关心事务的开始、提交或回滚,只需专注于业务逻辑。 9. **安全控制(Security)**:EJB3允许开发者使用角色和权限来控制对bean...

    ejb3-persistence

    这些类和接口提供了CRUD(创建、读取、更新、删除)操作,事务管理,以及查询语言JPA(Java Persistence API)的实现,如Criteria API和JPQL(Java Persistence Query Language)。 "使用说明-jar包.txt"很可能是对...

    EJB3 实例练习(一)

    EJB3支持容器管理的事务,这意味着开发者无需手动管理事务的开始、提交和回滚。容器会根据bean方法的标注自动处理事务。例如,`@TransactionAttribute(TransactionAttributeType.REQUIRED)`表明方法将在现有事务中...

    EJB3实战的源代码

    6. **容器管理事务(CMT)**:EJB3的事务管理能力让开发者可以专注于业务逻辑,而不用关心事务的开始、提交和回滚。 7. **安全性**:EJB3提供了内置的角色和权限管理,可以使用`@RolesAllowed`等注解来控制对Bean...

    EJB3实战——Java

    无论是简单的业务逻辑处理还是复杂的事务管理、消息传递,EJB 3 都能够提供强大的支持。对于Java开发者而言,熟练掌握EJB 3 的使用不仅能够提升个人技能水平,也能够在实际工作中解决更多的技术难题。 综上所述,...

Global site tag (gtag.js) - Google Analytics