OGSADAI数据访问中间件.docx
- 文档编号:30568655
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:38
- 大小:372.18KB
OGSADAI数据访问中间件.docx
《OGSADAI数据访问中间件.docx》由会员分享,可在线阅读,更多相关《OGSADAI数据访问中间件.docx(38页珍藏版)》请在冰豆网上搜索。
OGSADAI数据访问中间件
JavaTransactionAPI
报告
1252996黄徐欢
1252998张学勤
1252973于航
1253003陈卓
目录
JavaTransactionAPI1
1.JTA概述2
1JTA概念2
2.事务及其处理3
2.JTA的发展历史4
3.主要设计目标及功能5
3.1主要设计目标:
5
3.2具体功能5
4.总体架构7
5、重要概念10
5.1、事务10
5.2、J2EE事务服务11
5.3、J2EE事务处理方式11
6、关键组件11
6.1、高层的应用事务划分接口UserTransaction12
6.1.1、在EJBServer中的UserTransaction支持12
6.1.2事务客户端中的UserTransaction支持12
6.2高层的事务管理接口13
6.2.1、Transaction接口13
6.2.2、TransactionManager接口13
6.3、XAResource接口14
7、Java三种事务类型对比15
7.1、JDBC事务15
7.2、容器事务15
7.3、三种事务差异15
1.JTA概述
1JTA概念
JTA,即JavaTransactionAPI,译为Java事务API。
JTA允许应用程序执行分布式
事务处理-----在两个或多个网络计算机资源上访问并且更新数据。
JTA支持极大地增强
了数据访问能力。
Java事务API(JTA:
JavaTransactionAPI)和它的同胞Java事务服
务(JTS:
JavaTransactionService),为J2EE平台提供了分布式事务服务(distributed
transaction),是J2EE标准的重要组成JTA具有三个主要的接口:
(1)允许事务型应用划定事务边界的高层应用接口。
(2)允许事务型资源管理器参与由外部事务管理器控制的全局事务的工业标准X/OpenXA协议的Java映射。
(3)允许应用服务器为了由应用服务器管理的应用程序而控制事务边界划定的高层事务管理器接口。
(注:
JTA接口从事务管理器的角度属于高层的。
相比之下,事务管理器低层API包括了用来实现事务管理器的接口。
比如,OTS的Java映射是事务管理器内部使用的低层接口。
)
JTA为J2EE平台提供了分布式事务服务,它隔离了事务与底层的资源,实现了透明的事务管理方式。
Java事务API(JTA)及其同门兄弟Java事务服务(JavaTransactionServiceJTS)为J2EE平台提供了分布式事务服务。
值得注意的是JTA只提供了接口,没有提供具体的实现。
JTS是服务OTS的JTA实现,简单的说JTS实现了JTA接口,并且符合OTS的规范。
2.事务及其处理
事务是计算机应用中不可或缺的组件模型,它保证了用户操作的四个特性(ACID),原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durabilily)。
关于事务最经典的示例莫过于信用卡转账:
将用户A账户中的500元人民币转移到用户B的账户中,其操作流程如下
(1)将A账户中的金额减少500
(2)将B账户中的金额增加500
这两个操作必须保正ACID的事务属性:
即要么全部成功,要么全部失败;假若没有事务保障,用户的账号金额将可能发生问题:
假如第一步操作成功而第二步失败,那么用户A账户中的金额将就减少500元而用户B的账号却没有任何增加(不翼而飞);同样如果第一步出错而第二步成功,那么用户A的账户金额不变而用户B的账号将增加500元(凭空而生)。
上述任何一种错误都会产生严重的数据不一致问题,事务的缺失对于一个稳定的生产系统是不可接受的。
一个分布式的事务涉及一个事务管理器和一个或者多个资源管理器。
一个资源管理器是任何类型的持久性的数据存储。
事务管理器负责协调所有事务参与者之间的通信。
下图为JavaEE分布式事务服务层次示意图,其中的小半圆代表JTA规范。
2.JTA的发展历史
JTA规范是由SunMicrosystems和在事务处理和数据库系统领域主导产业合作伙伴联合开发,具体见JSR907、Javas事务服务(JTS)页面,历经多次勘误形成目前版本。
2000年6月30日至8月10日,在Java社区过程中维护检查
2001年1月月30日至3月1日,在Java社区过程中维护检查
2001年9月27日至11月5日,在Java社区过程中维护检查
3.主要设计目标及功能
3.1主要设计目标:
JTA旨在成为一个定义明确的事务服务,向J2EE应用程序开发人员提供一种可以直接使用的服务。
作为选择,一个应用程序也可能这样部署,容器将代替开发人员来管理事务行为。
在后一种情况下,开发人员能够全神贯注于他们的应用程序的业务逻辑,同时由J2EE容器来负责事务逻辑。
另一个目标是提供模型明确的事务服务,对于每个单独的事务总是维持四个ACID特性。
尽管这是一个实现相关的问题,WebSphereApplicationServer提供为每个导入的或者导出的事务保护这些ACID特性的能力,而不管并发事务数目是多少
3.2具体功能
JTA主要提供两个功能,划分事务边界和允许资源参与到事务中。
其中:
(1)Javax.transaction.UserTransaction接口给应用提供了用程序控制事务边界的功能。
Java客户端程序或EJBbeans可能会使用这个接口。
UserTransaction.begin方法启动了一个全局事务并把事务与调用线程联系起来。
事务到线程的关联由事务管理器透明地进行管理。
(2)Javax.transaction.TransactionManager接口使得应用服务器代表正在被管理的应用程序控制事务边界。
例如,EJB容器为事务型EJB组件管理事务状态;容器使用TransactionManager接口主要在操作影响调用线程的事务上下文时去划分事务的边界。
事务管理器维护事务上下文与作为其内部数据结构一部分的线程的关联。
一个线程的事务上下文或者是null或者是引用了一个特定的全局事务。
多个线程可能并发地与同一个事务相关联。
具体功能包括:
启动一个事物
结束一个事物
挂起和继续一个事物
(3)事务管理器会选择性地支持定义以下在对象事务规范中的CORBA应用实体:
事务性客户端、事务性对象、可恢复的对象、事务性服务器和可恢复的服务器。
这些应用实体使用定义在按照OTS1.1规范说明的CosTransactions模块来访问事务管理器。
Transaction接口允许在与目标对象相关联的事务上执行操作。
当创建事务时每个全局事务都与一个Transaction对象相关联。
这个Transaction对象能够:
∙把由应用程序使用的事务型资源加入列表。
∙注册事务同步回调函数。
∙提交或回滚事务。
∙得到事务的状态。
(4)javax.transaction.xa.XAResource接口是基于X/OpenCAE规范的工业标准XA接口的一个Java映射(分布式事务处理:
XA规范)。
∙XAResource接口定义了分布式事务处理(DTP)环境中在一个资源管理器和一个事务管理器之间的合约。
一个资源管理器的资源适配器实现了XAResource接口,支持一个全局事务到一个事务资源的关联,比如到一个关系数据库的连接。
∙一个全局事务在DTP系统中是一个或多个资源管理器(RM)执行的单元工作。
这样一个系统依赖一个外部事务管理器,如Java事务服务(JTS),来协调事务。
具体功能包括:
识别资源管理器
打开一个资源管理器
关闭一个资源管理器
控制线程
事物关联
外部事物的连接
资源分享
失败恢复
4.总体架构
JTA的架构包括事务管理器(TransactionManager)和一个或多个支持XA协议的资源管理器(ResourceManager)两部分,我们可以将资源管理器看做任意类型的持久化数据存储;事务管理器则承担着所有事务参与单元的协调与控制。
根据所面向对象的不同,我们可以将JTA的事务管理器和资源管理器理解为两个方面:
面向开发人员的使用接口(事务管理器)和面向服务提供商的实现接口(资源管理器)。
其中开发接口的主要部分即为上述示例中引用的UserTransaction对象,开发人员通过此接口在信息系统中实现分布式事务;而实现接口则用来规范提供商(如数据库连接提供商)所提供的事务服务,它约定了事务的资源管理功能,使得JTA可以在异构事务资源之间执行协同沟通。
以数据库为例,IBM公司提供了实现分布式事务的数据库驱动程序,Oracle也提供了实现分布式事务的数据库驱动程序,在同时使用DB2和Oracle两种数据库连接时,JTA即可以根据约定的接口协调者两种事务资源从而实现分布式事务。
正是基于统一规范的不同实现使得JTA可以协调与控制不同数据库或者JMS厂商的事务资源,其架构如下图所示:
开发人员使用开发人员接口,实现应用程序对全局事务的支持;各提供商(数据库,JMS等)依据提供商接口的规范提供事务资源管理功能;事务管理器(TransactionManager)将应用对分布式事务的使用映射到实际的事务资源并在事务资源间进行协调与控制。
下面,本文将对包括UserTransaction、Transaction和TransactionManager在内的三个主要接口以及其定义的方法进行介绍。
(1)面向开发人员的接口为UserTransaction,开发人员通常只使用此接口实现JTA事务管理,其定义了如下的方法:
begin()-开始一个分布式事务,(在后台TransactionManager会创建一个Transaction事务对象并把此对象通过ThreadLocale关联到当前线程上)
commit()-提交事务(在后台TransactionManager会从当前线程下取出事务对象并把此对象所代表的事务提交)
rollback()-回滚事务(在后台TransactionManager会从当前线程下取出事务对象并把此对象所代表的事务回滚)
getStatus()-返回关联到当前线程的分布式事务的状态(Status对象里边定义了所有的事务状态,感兴趣的读者可以参考API文档)
setRollbackOnly()-标识关联到当前线程的分布式事务将被回滚
(2)面向提供商的实现接口主要涉及到TransactionManager和Transaction两个对象:
Transaction代表了一个物理意义上的事务,在开发人员调用UserTransaction.begin()方法时TransactionManager会创建一个Transaction事务对象(标志着事务的开始)并把此对象通过ThreadLocale关联到当前线程。
UserTransaction接口中的commit()、rollback(),getStatus()等方法都将最终委托给Transaction类的对应方法执行。
Transaction接口定义了如下的方法:
commit()-协调不同的事务资源共同完成事务的提交
rollback()-协调不同的事务资源共同完成事务的回滚
setRollbackOnly()-标识关联到当前线程的分布式事务将被回滚
getStatus()-返回关联到当前线程的分布式事务的状态
enListResource(XAResourcexaRes,intflag)-将事务资源加入到当前的事务中(在上述示例中,在对数据库A操作时其所代表的事务资源将被关联到当前事务中,同样,在对数据库B操作时其所代表的事务资源也将被关联到当前事务中)
delistResourc(XAResourcexaRes,intflag)-将事务资源从当前事务中删除
registerSynchronization(Synchronizationsync)-回调接口,Hibernate等ORM工具都有自己的事务控制机制来保证事务,但同时它们还需要一种回调机制以便在事务完成时得到通知从而触发一些处理工作,如清除缓存等。
这就涉及到了Transaction的回调接口registerSynchronization。
工具可以通过此接口将回调程序注入到事务中,当事务成功提交后,回调程序将被激活。
TransactionManager本身并不承担实际的事务处理功能,它更多的是充当用户接口和实现接口之间的桥梁。
下面列出了TransactionManager中定义的方法,可以看到此接口中的大部分事务方法与UserTransaction和Transaction相同。
在开发人员调用UserTransaction.begin()方法时TransactionManager会创建一个Transaction事务对象(标志着事务的开始)并把此对象通过ThreadLocale关联到当前线程上;同样UserTmit()会调用TransactionMmit(),方法将从当前线程下取出事务对象Transaction并把此对象所代表的事务提交,即调用Tmit()
begin()-开始事务
commit()-提交事务
rollback()-回滚事务
getStatus()-返回当前事务状态
setRollbackOnly()
getTransaction()-返回关联到当前线程的事务
setTransactionTimeout(intseconds)-设置事务超时时间
resume(Transactiontobj)-继续当前线程关联的事务
suspend()-挂起当前线程关联的事务
在系统开发过程中会遇到需要将事务资源暂时排除的操作,此时就需要调用suspend()方法将当前的事务挂起:
在此方法后面所做的任何操作将不会被包括在事务中,在非事务性操作完成后调用resume()以继续事务(注:
要进行此操作需要获得TransactionManager对象,其获得方式在不同的J2EE应用服务器上是不一样的)
5、重要概念
5.1、事务
事务是计算机应用中不可或缺的组件模型,它是用户定义的一个数据库操作系列,这些操作要么全做,要么不做,保证了用户操作的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
它构成了数据库应用程序的基本逻辑单位。
5.2、J2EE事务服务
企业级Java中间件的分布式事务服务包括五层:
事务管理器(TransactionManager)、应用服务器(ApplicationServer)、资源管理器(ResourceManager)、应用程序(ApplicationProgram)和通信资源管理器(CommunicationResourceManager)。
每一层都通过实现一组事务API和相关机制参与到分布式事务处理系统中。
事务管理器:
是一个系统级的组件,是事务服务的访问点。
提供了一组服务和相关的管理机制,用于支持事务划分、事务资源管理、事务同步和事务上下文的传播。
应用服务器(或者称为TPmonitor)提供了支持应用程序运行环境的基础设施,这个运行环境包括了事务状态管理。
应用服务器的一个例子是EJB服务器。
资源管理器(通过资源适配器[ResourceAdapter],资源适配器类似于数据库连接)为应用程序提供了对资源的访问。
资源管理器通过实现一组事务资源接口来参与到分布式事务中。
事务管理器使用这组事务资源接口在处理事务联系、事务完成和事务恢复的相关工作。
资源管理器的一个例子是关系数据库服务器。
基于组件的事务性应用运行在应用服务器环境中,需要依赖应用服务器通过事务属性声明设置所提供的事务管理支持。
这种类型应用的典型例子是EJB。
除此之外,一些独立的Java客户端程序需要使用应用服务器或事务管理器所提供的高层接口来控制事务界限。
通讯资源管理器(CRM)支持事务上下文的传播和事务服务的访问请求。
JTA文档中没有规定通信的要求。
请参考JTS规范[2]获得有关事务管理器之间互操作的详细信息。
5.3、J2EE事务处理方式
本地事务处理:
紧密依赖于底层资源管理器(例如数据库连接),事务处理局限在当前事务资源内。
此种事务处理方式不存在对应用服务器的依赖,因而部署灵活却无法支持多数据源的分布式事务。
分布式事务处理:
JJava事务编程接口(JTA:
JavaTransactionAPI)和Java事务服务(JTS;JavaTransactionService)为J2EE平台提供了分布式事务服务。
分布式事务(DistributedTransaction)包括事务管理器(TransactionManager)和一个或多个支持XA协议的资源管理器(ResourceManager)。
我们可以将资源管理器看做任意类型的持久化数据存储;事务管理器承担着所有事务参与单元的协调与控制。
JTA事务有效的屏蔽了底层事务资源,使应用可以以透明的方式参入到事务处理中;但是与本地事务相比,XA协议的系统开销大,在系统开发过程中应慎重考虑是否确实需要分布式事务。
若确实需要分布式事务以协调多个事务资源,则应实现和配置所支持XA协议的事务资源,如JMS、JDBC数据库连接池等。
6、关键组件
JavaTransactionAPI由三部分组成:
高层的应用事物划分接口(供事物客户使用)、高层的事务管理接口(供应用服务器使用)和X/OpenXA协议的标准Java映射(供事务性资源管理器使用)。
6.1、高层的应用事务划分接口UserTransaction
Javax.transaction.UserTransaction接口使得应用程序能够编程控制事务边界。
这个接口可以由Java客户端程序或者EJB来使用。
UserTransaction中定义了如下的方法:
begin()-开始一个分部式事务,在后台TransactionManager会创建一个Transaction事务对象并把此对象通过ThreadLocal关联到当前线程上。
commit()--提交事务,在后台TransactionManager会从当前线程取出事务对象并把此对象所代表的事务提交。
rollback()-回滚事务,在后台TransactionManager会从当前线程下取出事务对象并把此对象所代表的事务回滚。
getStatus()-返回关联到当前线程的分布式事务状态。
setRollbackOnly()-标识关联到当前线程的分布式事务将被回滚。
6.1.1、在EJBServer中的UserTransaction支持
EJB中对事务的管理有两种类型:
1、Bean自管理事务,对于自管理事务的EJB,需要从EJB上下文中中获取UserTransaction的接口引用,由自己负责完成事务的开始、提交或者回滚。
EJB这样处理事务称为编程型事务。
2、由容器负责事务管理,对于这样的EJB,只需在其部署描述符中指定所需的事务相关属性,便可由EJB容器代替EJB进行事务管理。
这称为声明式事务。
6.1.2事务客户端中的UserTransaction支持
Java客户端程序需要首先通过JNDI来获得UserTransaction对象的引用,然后使用该对象的方法完成事务的开始、提交或者滚回。
6.2高层的事务管理接口
高层的事务管理接口只要涉及到TransactionManager和Transaction两个对象。
6.2.1、Transaction接口
Transaction代表了一个物理意义上的事务,在开发人员调用UserTransaction.begin()方法时TransactionManager会创建一个Transaction事务对象(标志着事务的开始)并把此对象通过ThreadLocale关联到当前线程。
UserTransaction接口中的commit()、rollback(),getStatus()等方法都将最终委托给Transaction类的对应方法执行。
Transaction接口定义了如下的方法:
Commit()-协调不同的事务资源共同完成事务的提交
Rollback()-协调不同的事务资源共同完成事务的回滚
setRollbackOnly()-标识关联到当前线程的分布式事务的状态
enListResource(XAResourcexaRes,intflag)-将事务资源加入到当前的事务中
delistResource(XAResourcexaRes,intflag)-将事务资源从当前事务中删除
registerSynchronization(Synchronizationsync)-回调接口,Hibernate等ORM工具都有自己的事务控制机制来保证事务,但同时他们还需要一种回调机制以便在事务完成时得到通知从而触发一些处理工作,如清除缓存等。
这就涉及到了Transaction的回调接口registerSynchronization。
工具可以通过此接口将回调程序注入到事务中,当事务成功提交后,回调程序将被激活。
6.2.2、TransactionManager接口
TransactionManager本身并不承担实际的事务处理功能,它更多的是充当用户接口和实现接口之间的桥梁。
下面列出了TransactionManager中定义的方法,可以看到此接口中的大部分事务方法与UserTransaction和Transaction相同。
在开发人员调用UserTransaction.begin()方法时,TransactionManager会创建一个Transaction事务对象(标志着事务的开始),并把次对象通过ThreadLocale关联到当前线程上;同样,UserTmit()会调用TransactionMmit(),方法将从当前线程下取出事务对象Transation并把此对象所代表的事务提交,即调用Tmit()。
begin()-开始事务
commit()-提交事务
rollback()-回滚事务
getStatus()-返回当前事务状态
setRollbackOnly()
getTransaction()-返回关联到当前线程的事务
setTransactionTimeout(intseconds)-设置事务超时时间
resume(Transactiontobj)-继续当前线程关联的事务
suspend()-挂起当前线程关联的事务
在系统开发过程中会遇到需要将事务资源暂时排除的操作,此时就需要调用suspend()方法将当前的事务挂起:
在此方法后面所做的任何操作将不会被包括在事务中,在非事
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OGSADAI 数据 访问 中间件
![提示](https://static.bdocx.com/images/bang_tan.gif)