会话EJB系列(四)SessionBean事务管理

(上一篇文章中我们介绍了《会话EJB系列(三)SessionBean生命周期》,本为的主要介绍SessionBean中事务管理)

SessionBean从功能上可以分为两类:

第一类:成为EAO:用于封装底层的实体和JPA,本质上其功能就是DAO。(不需要事务控制。因为JPA本质是对ORM实现的封装。)

第二类:充当业务组件:是底层EAO对象的Facade,系统控制器(如struts中的Action,springMVC中的Controller)将调用他们的业务方法来处理用户请求。(需要添加事务控制。因为它代表了一次完整的业务逻辑)

EJB的事务管理机制仍然是建立在JTA事务基础之上,因此应用服务器会负责处理事务管理的底层细节。

EJB3中仍提供容器管理事务(CMT)和Bean管理事务(BMT)两种,并允许采用Annotation机制来指定事务属性,替代了EJB2中的XML配置文件方式。

对于CMT:容器负责决定事务的边界:方法开始就是事务开始,方法结束就是事务结束。

对于BMT:事务边界由开发人员灵活决定(事务开始、事务回滚、事务结束)

一.容器管理事务

CMT:容器负责决定事务的边界:方法开始就是事务开始,方法结束就是事务结束。

(1)Annotation控制事务方式

SessionBean的事务管理机制与MDB的事务管理方式完全一样,都是通过在Bean上使用@TransactionManagement、        @TransactionAttribute两个Annotation来控制的。无需对该接口代码进行任何改变。

1) @TransactionManagement,value属性设置事务处理方式:CMT?还是BMT?,如:

TransactionManagementType.BEAN:指定使用BMT管理事务

TransactionManagementType.CONTAINER:指定使用CMT管理事务

2)@TransactionAttribute,既可以用于修饰SessionBean或MDB 的Bean实现类,也用于修饰某个业务方法(优先),

并通过value值,设置事务属性为枚举类型之一:

(2)捕获‘自定义异常’

默认,发生系统异常,CMT会控制事务回滚;若为自定义异常,不会回滚。

但可以,手工控制‘自定义异常’回滚,方式如下:

第一种:使用EJBContext的setRollbackOnly(),显示控制代码回滚

第二种:使用@ApplicationException Annotation,指定rollback属性为true即可

(3)注意

CMT意味着容器管理EJB业务方法中的事务,因此开发者不应该在开发时,调用任何开始、结束事务的方法

二.Bean管理

对于BMT:事务边界由开发人员灵活决定(事务开始、事务回滚、事务结束),主要通过UserTransaction来控制事务。本质,就是通过编程操作JTA事务管理器。

(1)EJB的Bean类中获取UserTransaction对象的,3种方式:

第一种:使用@Resource Annotation执行依赖注入

第二种:通过JNDI查找获取,如:UserTransaction  ut=(UserTransaction)ctx.lookup("UserTransaction");

第三种:使用EJBContext的getUserTransaction()方法获取,如:UserTransaction ut=ctx.getUserTransaction();

(2)UserTransaction 中所含方法简单解析 (略)

三.对比CMT和BMT

(1)特点

CMT(默认):容器负责决定事务的边界:方法开始就是事务开始,方法结束就是事务结束。

BMT:事务边界由开发人员灵活决定(事务开始、事务回滚、事务结束)  。本质,通过编程操作JTA事务管理器。

通常,EJB容器建议使用CMT事务管理。

(2)优缺点

BMT优点:更灵活!开发者自行决定事务边界

BMT缺点:

1.由于开发者采用硬编码方式来实现事务管理,不可避免的导致业务逻辑和是无逻辑混淆的缺陷,切难于切换其它管理方式。

2. 客户端调用BMT方法时,会暂停当前已有事务,就制约了组件的复用

(3)BMT有两种必须存在的场景,以及对应的争议:

1)开发者需要为业务方法中某段代码添加事务。(为何不将这段代码抽离?封装成一个方法?)

2)有状态SessionBean需要跨方法调用维护事务,也就是需要将多个方法放在一个事务中进行维护。(显示多个方法组成了一个完整的业务逻辑,为何不将它们整体封装成一个业务方法)

四.总结

SessionBean中事务管理,分为两种:容器管理事务(CMT)和Bean管理事务(BMT)

CMT(默认):容器负责决定事务的边界:方法开始就是事务开始,方法结束就是事务结束。

BMT:事务边界由开发人员灵活决定(事务开始、事务回滚、事务结束)  。本质,通过编程操作JTA事务管理器。

具体情况具体操作...

时间: 2024-11-06 16:23:11

会话EJB系列(四)SessionBean事务管理的相关文章

会话EJB系列(三)SessionBean生命周期

(上一篇文章中我们介绍了<会话EJB系列(二)EJB分类> ,本文的核心为:SessionBean的生命周期) EJB生命周期:指EJB在运行过程中经历的阶段和状态. 首先强调的是:SessionBean的生命周期是由容器控制的而不是应用程序!对于客户端是完全透明的.但是对于开发者而言,必须了解SessionBean在EJB中的运行规律,才可以更好的管理SessionBean.当然允许被开发者改变. 在前面的文章中我们提到过,可以将EJB容器理解为Spring容器,运行在EJB中的Sessio

会话EJB系列(五)拦截器

上一篇文章<会话EJB系列(四)SessionBean事务管理>中,我们介绍了SessionBean的事务管理机制. 本文主题'拦截器',详细介绍其用途.作用.与Spring框架AOP的对比,并介绍其初步用法. 一.简介 企业级应用中经常面对的事务管理.安全检查.缓存.对象池管理等,为此Spring框架提供了AOP方式,灵活控制业务方法!而EJB3没有提供AOP支持,那么他又是如何应对的呢? JavaEE规范中提供的横切性服务:事务管理和安全检查. EJB容器实现JavaEE规范 用CMT解决

会话EJB系列(二)EJB分类

(本文承接上一篇文章<会话EJB系列(一)EJB概述>,继续对EJB内容展开详细解说) EJB规范中定义了三种Bean: 会话Bean(Session Bean) 实体Bean(Entity Bean) 消息驱动Bean(MessageDrive Bean) 一.SessionBean的概念和作用 (1)定义 作用:用于处理业务逻辑的完整组件. 当SessionBea部署在在EJB容器中后,客户端获取该EJB组件,并调用它的方法,至方法结束,称为:客户端与SessionBean之间的一次会话,

Git系列四之分支管理

Git系列四之分支管理 2017-03-02 分类:Git 阅读(1175) 评论(1) 来自为知笔记(Wiz) 原文地址:https://www.cnblogs.com/wangkaiok/p/cdcc9cf3f6e3d1a864a46177209a7c8f.html

Spring整合JMS(四)——事务管理

原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.JmsTransactionManager在执行本地资源事务管理时将从指定的ConnectionFactory绑定一个ConnectionFactory/Session这样的配对到线程中.JmsTemplate会自动检测这样的事务资

会话EJB系列(一)EJB概述

EJB(Enterprise Java Bean)是Java EE(以前叫J2EE)的核心规范,不仅仅是一种优秀的组件技术,而且还是Java EE 其它规范(如RMI,JNDI,JMS等)的具体应用. 一.EJB的概念和意义 (1)EJB规范的由来 随着软件规模的快速增大和技术复杂度(分布式软件的开发技术,如CORBA.RMI等)的增加,导致软件开发变得越来越复杂,使普通程序员难于处理各种系统级服务,从而使得大型软件系统的开发变得难以为继. 后来,Sun公司发布了EJB规范,目的是统一各种分布式

MySQL-第十四篇事务管理

1.什么是事务 事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行. 2.事务具备的4个特性: 1>原子性(Atomicity):事务是应用中最小的执行单位,事务是应用中不可再分的最小逻辑执行体. 2>一致性(Consistency):事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态.当数据库只包含事务成功提交的结果时,数据库处于一致性状态.如果系统运行发生中断,某个事务尚未完成而被迫中断,而该未完成的事务对数据库所做的修改已被写入

会话EJB系列(六)依赖注入

在本文的开始之前,先给大家介绍一个概念"依赖". 什么是依赖呢? 简单的说,就是A组件需要调用B组件,B组件需要调用C组件,C组件需要调用D组件-..这种调用称为:依赖! 在最早的应用程序中,依赖关系时通过new关键字来实现的.A组件依赖B组件,就是在A组件中显示的new一个B组件.缺点: 1.硬编码,耦合性强,难以维护.A组件只需要B组件中的方法,不必关心B组件的创建问题! 2.频繁的创建对象,导致系统开销增大. 上面的这种缺点,直接催生了'工厂模式'. 在工厂模式中,A组件依赖B组

[Spring框架]Spring 事务管理基础入门总结.

前言:在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一, 什么是事务 事务是逻辑上一组操作,这组操作要么全都成功,要么全都失败. 事务的属性: ACID原子性(Atomicity): 事务作为一个整体被执行,包含在其中的对数据的操作要么全部被执行,要么都不执行.一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态.