收藏 分享(赏)

6-EJB事务.ppt

上传人:fcgy86390 文档编号:6984810 上传时间:2019-04-29 格式:PPT 页数:18 大小:1.81MB
下载 相关 举报
6-EJB事务.ppt_第1页
第1页 / 共18页
6-EJB事务.ppt_第2页
第2页 / 共18页
6-EJB事务.ppt_第3页
第3页 / 共18页
6-EJB事务.ppt_第4页
第4页 / 共18页
6-EJB事务.ppt_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、EJB3.0 事务管理概述,事务产生的动机,事务产生的各种原因产生事务的原因有很多种原因,在这里我们通过列举几种常见的几种情况来分析事务的动机。 原子性操作网络故障与机器故障多用户共享数据,在很多企业级应用程序的开发过程,我们经常需要执行复杂的,连续的, 整体的业务。比如我们经典的银行账户问题。,比如在银行分布式部署过程中,客户端通过网络调用服务端的代码,在这 其间网络中断了,此时针对客户的取款事务应该能过识别此种故障并起作用。,在分布式企业级应用过程中,经常会出现多个客户端连接到应用服务器, 同时由服务器维护数据库中的持久化数据。,EJB3中的事务管理策略,什么是事务?事务(Transact

2、ion)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C+或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。,一个事务是一个 不可分割的工作单位, 事务中包括的诸操作 要么都做,要么都不做。,事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是 密切相关的 。,一个事务的执行不能被其他事务干扰。即一

3、个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰 。,持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响 。,事务的模型,平面式事务模型平面型事务模型整个事务是一个整体,不可划分为子事务。 实际上平面式事务就是一系列的操作,这些操作象一个独立的操作一样连续执行。当你执行平面式事务时,你的应用程序执行一些操作,其中一些操作是永性操作,有些是则不是。当你结束一个事务时,通常会得到一个二进制的结果:成功或失败。成功的事务被提交,失败的事务则被异常中止。也就是说只有事务

4、以提交形式结束了,资源才能被永久化。,平面式事务模型(全有或全无),事务的模型,嵌套式事务模型嵌套式事务允许您在其他的操作单元中嵌入原子操作单元。被嵌入的操作单元可以发生回退,而不影响整个事务发生回退。也可以被嵌套的事务模型看做树形结构,所有的事务都源于根状事务(或顶端事务),根状事务是主事务。在树状结构中,其它的一些事务也被称做子事务,子事务可以是平面式事务模型或嵌套事务模型。,事务在EJB组件中的应用,编程式事务一般情况下,一个事务的开始,则必将终止于提交或异常结束。而我们关注是在什么时侯开始了事务,什么情况下提交了事务或出现了异常,上述这些被我们称为事务边界。我们可以通过编程的方式来划分

5、事务边界。但是使用了这种方式来划分事务边界,则要求我们在代码中添加事务处理的逻辑。也就是说,在代码中需要指定了一个事务开始的声明以及指定一个事务提交或异常结束的声明。,如何来进行事务边界的划分?,编程式事务,事务在EJB组件中的应用,声明式事务声明式事务允许EJB组件自动参与到事务中去。简而言之,你的EJB组件不会发布事务的开始,事务的提交及异常终止等事务边界,而这一切将会由EJB容器来实现。,声明式事务模型,事务的类型,本地事务与全局事务 本地事务 在单个 EIS 或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。本地和全局事务都使用 javax.transaction.

6、UserTransaction 接口划分界限,客户端必须使用此接口。本地事务不使用事务管理器,因而处理速度更快。 全局事务资源管理器管理和协调的事务,可以跨越多个数据库和进程。全局事务由应用服务器管理,使用JTA 。,本地事务与全局的优缺点?以及如何选择事务类型?,全局事务: 全局事务有一个重大的缺陷,代码需要使用JTA: 一个笨重的API(部分是因为它的异常模型)。此外, JTA的UserTransaction通常需要从JNDI获得,这意味着我们为了JTA, 需要 同时 使用JNDI 和 JTA。显然全部使用全局事务限制了应用代码的 重用性,因为JTA通常只在应用服务器的环境中才能使用。 本

7、地事务:本地事务容易使用,但也有明显的缺点: 它们不能用于多个事务性资源。 例如,使用JDBC连接事务管理的代码不能用于全局的JTA事务中。 另一个缺点是局部事务趋向于入侵式的编程模型。,事务在JDBC中的实现,JDBC事务JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 在JDBC中,事务操作缺省是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作,操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回滚。 在JDBC中,可以

8、通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调 用commit()来进行整体提交,倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常;此时就可以在异常捕获时调用 rollback()进行回滚。,JTA(全局式事务解决方案),JTA(Java Transaction API)事务Java 事务 API(JTA) 及其同门兄弟 Java 事务服务(Java Transaction Service JTS)为 J2EE 平台提供了分布式事务服务。一个分布式的事务涉及一个事务管理器和一个或者多个

9、资源管理器。一个资源管理器是任何类型的持久性的数据存储。事务管理器负责协调所有事务参与者之间的通信。 用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。 要使用JTA事务,必须使用XADataSource来产生数据库连接,产生

10、的连接为一个XA连接。,XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection) 连接的区别在于: XA可以参与JTA的事务,而且不支持自动提交。 (Oracle, Sybase, DB2, SQL Server等大型数据库才支持XA, 支持分布事务。 ),javax.transaction.UserTransaction tx = null; java.sql.Connection conn = null; try tx = (UserTransaction) context.lookup(“java:comp/UserTransaction

11、”); /取 得JTA事务,本例中是由Jboss容器管理 DataSource ds = (DataSource) context.lookup(“java:/XAOracleDS”); /取得数据库连接池,必须有支持XA的数据库、驱动程序 tx.begin(); conn = ds.getConnection(); Statement statement = conn.createStatement(); String sql = “insert into testtable (cell1,cell2,cell3,cell4) values(”+System.currentTimeMilli

12、s()+“,)”; int insert = statement.executeUpdate(sql); /mit(); /JTA事务中不要嵌套JDBC事务啦,重要,切记,否 则会抛出异常! if(true)throw new Exception(“故意抛出的异常!”); int num = statement.executeUpdate(“delete testtable”); mit(); catch (Exception e) trytx.rollback();catch(Exception e1)out.println(“catch:事务回滚失败! finally 释放资源 ,JTA测

13、试事务案例2-1,1、创建一个实体Bean,Entity Table(name=“TRANSTAB“,schema=“t27“) public class TransTab private Integer tid; private String tname;,2、创建一个会话Bean,PersistenceContext(unitName=“StuInfo“) EntityManager eManager;public void addTrans(Integer id) TransTab tab = new TransTab(); tab.setTid(id); tab.setTname(“j

14、acky“+id); eManager.persist(tab); ,JTA测试事务案例2-2,3、写一个测试类,/没有事务处理的测试 public void testWithoutTrans() throws Exception InitialContext ctx = new InitialContext(); TransBizRemote tBizRemote = (TransBizRemote)ctx.lookup(“TransBiz/remote“); for(int i=0;i10;i+) tBizRemote.addTrans(i);if(i=5)throw new Runtim

15、eException(“运行到5的时候,则遇到一个异常“);,/有事务处理的案例 public void testWithTrans() throws Exception InitialContext ctx = new InitialContext(); UserTransaction userTransaction = (UserTransaction)ctx.lookup(“UserTransaction“); TransBizRemote tBizRemote = (TransBizRemote)ctx.lookup(“TransBiz/remote“); try userTransa

16、ction.begin(); for(int i=0;i10;i+) tBizRemote.addTrans(i);if(i=5)throw new RuntimeException(“运行到5的时候,则遇到一个异常“); userTmit(); catch (Exception e) e.printStackTrace(); userTransaction.rollback(); ,有事务处理会回滚所有的操作,在EJB3中采用BMT管理事务,Bean管理事务(BMT)在EJB组件中我们通过使用编程方式进行事务管理,通过使用JPA或JDBC或HIBERNATE等持久化组件提供的事务处理API进

17、行事务管理的方式,我们统称为BMT。,TransactionManagement(TransactionManagementType.BEAN) public class TitlesDaoImp implements TitlesDao private EntityManager emg;public TitlesDaoImp()emg=EntityManagerHelper.getEntityManager();TransactionAttribute(TransactionAttributeType.REQUIRED) public void test(Titles newobj,Tit

18、les old) throws MyExceptionEntityTransaction tr=emg.getTransaction(); trytr.begin(); this.update(old);this.save(newobj);mit();catch(Exception f)f.printStackTrace();tr.rollback(); ,指定是通过BMT方式管理事务,在构造函数中初始化EntityManager,编程式管理事务(BMT),BMT管理事务:关键代码,Stateless TransactionManagement(TransactionManagementTyp

19、e.BEAN) public class TransBizResource implements TransBizResourceRemote private EntityManagerFactory factory=null; private EntityTransaction uTransaction = null; private EntityManager eManager = null; /构造函数,构造本地的EntityManager public TransBizResource() throws Exception factory = Persistence.createEnt

20、ityManagerFactory(“Trans“); eManager = factory.createEntityManager(); /定义一个业务逻辑 public void addTrans(Integer id) throws Exception uTransaction = eManager.getTransaction(); try uTransaction.begin(); TransTab tab = new TransTab(); tab.setTid(id); tab.setTname(“andy“+id); eManager.persist(tab); uTmit()

21、; System.out.println(); catch (Exception e) uTransaction.rollback(); System.out.println(“操作失败“); ,在EJB3中采用CMT管理事务,容器管理事务(CMT)容器管理事务(CMT)也就是我们的声明式事务,通过使用CMT我们将划分事务边界的功能交给EJB容器来完成,由EJB容器决定什么时侯开始事务,提交事务以及出现异常时对事务进行回退(rollback)。在EJB3中CMT事务是通过使用JTA这一重量级的API来完成。(一般情况下,我们将事务定义在session bean上面,这与我们在spring中将事

22、务定义在业务服务层道理一样)。,TransactionManagement(TransactionManagementType.CONTAINER) public class TitlesDaoImpOfCmt implements TitlesDao PersistenceContext(unitName=“mycmt“)private EntityManager emg;TransactionAttribute(TransactionAttributeType.REQUIRED)public void test(Titles newobj,Titles old) throws MyExce

23、ptionthis.save(newobj);this.update(old); ,指定这是CMT管理事务,EntityManager可以通过注入方式初始化,指定事务的级别,CMT的persistence.xml的配置方式,在EJB3中的事务处理的级别,TransactionAttributeType中指定事务级别 REQUIRED : 方法在一个事务中执行,如果调用的方法已经在一个事务中,则使用该事务,否则将创建一个新的事务。 MANDATORY : 方法必须在一个事务中执行,也就是说调用的方法必须已经有一个事务,否则新抛出一个错误( ERROR )。 REQUIRESNEW : 方法将在一个新的事务中执行,如果调用的方法已经在一个事务中,则暂停旧的事务。 SUPPORTS : 如果方法在一个事务中被调用,则使用该事务,否则不使用事务。 NOT_SUPPORTED :如果方法在一个事务中被调用,将抛出一个错误( ERROR ),如果没有指定参数, TransactionAttribute 注释使用 REQUIRED 作为默认参数。,Thank you,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报