第9章TUXEDO的数据库编程.pdf
《第9章TUXEDO的数据库编程.pdf》由会员分享,可在线阅读,更多相关《第9章TUXEDO的数据库编程.pdf(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 9.1 TUXEDO 如何处理分布式事务如何处理分布式事务 在两层的 C/S 结构中,客户端直接访问数据库,当采用 TUXEDO 中间件后,形成三层结构。这时,客户端不直接访问数据库,而是改为调用中间件 TUXEDO 服务端上的服务,由TUXEDO 服务端访问数据库,并把结果返回给客户端。如图所示。TUXEDO 支持 ORACLE、SYBASE、INGRES、DB2 等 UNIX 上的大型数据库和 NT 上的SQL Server,并且还支持 C-ISAM 文件系统。即可以通过 XA 协议,也可不用 XA 协议与数据库进行连接。在说明 TUXEDO 与数据库的连接的配置及编程之前,我们先解释一
2、些名词。名词解释名词解释 资源管理器资源管理器(RESOURCE MANAGER):最常见的是数据库,可以是其他的,如 TUXEDO 的 QUEUE,EJB 的 JMS 等,它们对数据进行管理和维护.事务事务(TRANSACTION):事务的定义很多,简单地说,事务是对资源管理器的一组操作,它使所涉及的资源管理器从一个状态转变到另一个状态,这些操作要么全部成功,要么全部失败。事务具有以下的 4个特征(一般称为 ACID):原子性原子性(ATOMICITY):指事务中的所有操作作为一个整体单元要么成功要么失败.一致性一致性(CONSISTENCY):一致性意味着不管事务提交或放弃,参与事务的所以
3、资源管理器 在事务结束后都保持一种合法的状态.一致性也意味着,当一个事务结束时,所有的参 与者都要释放它所锁住的资源.隔离性隔离性(ISOLATION):隔离性意味着事务正在处理过程中,在事务外面无法看到事务处理的 中间结果.持久性持久性(DURABILITY):使事务的最终结果已被真正写到磁盘系统中.本地事务本地事务(LOCAL TRANSACTION):如果一个事务只涉及到一个资源管理器,那么该事务称为本地事务。在 TUXEDO 中,不通过客户端 数据库 客户端 客户端 TUXEDO 应用服务器 XA 接口的事务都是本地事务,如:在 ORACLE 中,用 EXEC CONNECT 建立与数
4、据库的连接,并用 EXEC COMMIT 提交一个事务,那么该事务就是本地事务.全局事务全局事务(GLOBAL TRANSACTION):全 局 事 务 涉 及 到 一 个 或 多 个 资 源 管 理 器,它 也 称 为 分 布 式 事 务(DISTRBUTED TRANSACTION),对所有涉及的资源管理器的操作必须被看作单个工作单元。它们必须被同步,并在所有服务器上圆满完成,否则,就必须被彻底取消。例如:一个服务器在写过程中被关闭,那么事务处理中其他系统上的所有写的东西就必须被取消。在 TUXEDO 中,采用 XA 接口的事务都是全局事务。全局事务是相对 LT 而言的,它也有 AICD
5、四个特性,所不同的是它可以跨越多个资源管理器,这些资源管理器可能在不同的平台上。在 TUXEDO中,一个全局事务最多可跨越 16 个不同的资源管理器.事务管理器事务管理器(TRANSACTIN MORNITOR):管理协调参与全局事务的各个资源管理器的准备,提交及回滚等操作,事务管理器还在出现场地故障、网络故障或全局资源死锁时协调全局事务的恢复。TUXEDO 在全局事务中就充当事务管理器的作用。在一个全局事务中有一个事务协调器,有一个以上的资源管理器。事务协调器与资源管理器之间采用 XA 协议进行通讯在 TUXEDO 中一个 GROUP 只能有以个资源管理器,所以一个全局事务会跨越多个 GRO
6、UP XA 协议协议:XA 协议由 TUXEDO 首先提出,并交给 X/Open 组织,作为资源管理器(数据库)与事务管理器的接口标准。Informix 是最早宣布支持 XA 协议的数据库厂家,Informix5.0 以上的版本都提供 XA 接口,以实现与 TUXEDO 的连接。目前,Oracle、Informix、DB2、Sybase 等各大数据库厂家都提供对XA的支持.XA协议采用两阶段提交方式来管理分布式事务.XA接口提供资源管理器与事务管理器之间的进行通讯的标准接口,TUXEDO 支持基本的 XA 规范 (PRELIMINARY XA SPECIFICATION),及最终的XA规范(T
7、HE FINAL SPECIFICATION).XA协议包括两套函数,以 xa_开头的及以 ax_开头的.以下的函数使事务管理器可对 RM 进行操作 xa_open,xa_close:建立,关闭与 RM 的连接 xa_start,xa_end:开始,结束一个本地事务 xa_prepare,xa_commit,xa_rollback:预提交,提交,回滚一个本地事务 xa_recover:回滚一个已进行预提交的事务 ax_开头的函数使 RM 可以动态在事务管理器中进行注册,并可以对 XID(TRANSACTION IDS)进行操作.说明:在 FINAL XA SPECIFICATION 中,用 X
8、ID 代替全局事务 RID ax_reg,ax_unreg:允许一个 RM 在一个 TMS(TRANSACTOIN MANAGER SERVER)中动态注册或撤消注册.全局事务 rid_开头的函数在 PRELIMINARY XA SPECIFICATION 中有,在 FINAL XA SPECIFICATION 中没有定义.全局事务 rid_cmp:比较两个全局事务 RID 全局事务 rid_fmt:格式化一个全局事务 RID,以便打印 全局事务 rid_hash:根据全局事务 RID,生成一个 HASH 值.现在主要的数据库都支持 FINAL XA SPECIFICATION TUXEDO
9、中的全局事务有以下特点:中的全局事务有以下特点:1.可以在客户端或服务端开始一个全局事务 2.在 TUXEDO 中全局事务能跨越多个进程 3.每个全局事务有一个唯一的 ID 号(全局事务 RID)标识,它可在 TUXEDO 的进程间传 递。4.全局事务可以跨越 DOMAIN 一个全局事务从发起到提交的过程一个全局事务从发起到提交的过程:全局事务的提交采用两阶段提交方式.在两阶段提交过程中,应用程序是事务提交得发起者,应用程序通过调用 TPCOMMIT()开始一个事务的提交,该应用所在GROUP的 TMS是这个事务的协调者(COORDINATOR),我们称之为 COORDINATOR TMS,其
10、他参与本事务的 GROUP 所对应的 TMS,我们称之为:SUBORDINATE TMS,CORDINATOR TMS 负责与所有参与本全局事务的 RM 的通讯.完成该事务的提交,整个过程如下:1.应用程序通过调用 TPCOMMIT()开始一个事务的提交 2.CORDINATOR TMS 给参与该全局事务的每个 GROUP 中的 TMS 发送请求,每个 TMS 要 求 RM 进行预提交操作 3.每个 RM 各自进行预提交,预提交指把要更改的数据写到磁盘上,以便在失败时可以进行 恢复.但没有真正更新 RM 4.当 RM 预提交完毕,每个 SUBORDINATE TMS 都把预提交操作结果(成功或
11、失败)告诉给 COORDINATOR TMS,5.如果有任何一个 RM 预提交失败,或 COORDINATOR TMS 得不到它的应答,那么 COORDINATOR TMS 告诉所有的 RM 回滚它们各自的本地事务.如果所有的 RM 预提交都成功,那么 COORDINATOR TMS 在它所在机器的 TLOG 文件中 写一条记录,内容包括该全局事务的全局事务 RID,参与该全局事务的所以 RM 的列表及 其他信息.以便在第二阶段提交失败时回滚.6.下一步做什么取决于在 UBBCONFIG 中 TP_COMMIT_CONTROL 得设置 TP_CMT_LOGGED TPCOMMIT()调用返回,
12、程序继续往下走,各个RM各自进行真正得提交操作,如果在第二阶段提交失败,TMS 时是不知道的.而这是 TPCOMMIT()已返回成功.TP_CMT_COMPLETE TPCOMMIT()会等到第二阶段提交完成才返回,如果在第二阶段提交失败,TMS 是知道的.并且 TPCOMMIT()会返回失败.默认值是 TP_CMT_COMPLETE 事务模式和非事务模式:事务模式和非事务模式:TUXEDO 的应用程序可分为两种,事务模式和非事务模式,有以下两种方式可以使一个TUXEDO 应用处于事务模式下:1.显式:通过调用 tpbegin(),显式开始一个全局事务 2.隐式:在UBBCONFIG中对一个S
13、ERVICE 设置了AUTOTRAN=Y,当该 SERVICE 被调用 时,TUXEDO 会自动启动一个全局事务 注意:AUTOTRAN=Y 只对全局事务起作用,对本地事务不起作用。例如:下面的程序中 SERVICE A 中调用了 SERVICE B A(TPSRCINFO*RQST)tpcall(B,.,flags)那么:如果 A当前不处于事务模式中,A在 UBBCONFIG中设置了 AUTOTRAN=Y,则系统自动起一个全局事务 如果 A 当前已处于事务模式中,A 在 UBBCONFIG 中设置了 AUTOTRAN=Y,则:1.如果 tpcall()中的 flags 没有设置 TPNOTR
14、AN(默认方式是不设置)那么SERVICE:B 参与当前的事务。2.如果 tpcall()中的 flags 为 TPNOTRAN,那么 SERVICE:B 不参与当前的事务。注意:如果在 UBBCONFIG 中对 SERVICE B 设置了 AUTOTRAN=Y,那么当前的事务被自动挂起,系统为 B 自动起一个新的事务,如果 B 中的事务失败了,对 A 中的事务没有影响。TUXEDO 中与全局事务有关的设置中与全局事务有关的设置:与全局事务有关的设置包括:RESOURCE,MACHINE,GROUPS,SERVICE 4 个节 在在 RESOURCE 中设置主要有中设置主要有:MAXGTT(M
15、AX Global Transaction)在任一时刻在某一台服务器上最多可以有多少个全局事务存在,也就是可以最多有多少个未提交的全局事务,范围:0-32767。0 意味着该系统不支持事务,默认值是 100.该值也可在MACHIENS 中设置。在 MACHINES 中设置的值回覆盖在 RESOURCE 中的设置值。GTT(Global Transaction Table)TUXEDO 在 BULLETIN BOARD 中维护的一张表,用于记录全局事务的状态信息,在该台服务器上发起的或该台服务器参与的每个全局事务,在 GTT 中都对应一条记录.每台服务器的 GTT 中最多可以有多少条全局事务的记
16、录是由 MAXGTT 决定的,当一个全局事务成功提交时,它在 GTT 中的记录将被删除.如果该全局事务提交失败,它在 GTT 中的记录还会保持一段时间,一般是 5 分钟.所以 GTT 应该大于 TLOGSIZE。GTT 的范围为 0-64,000,默认值为100,可以在 MACHINE 中覆盖该设置.CMTRET:设置 TP_COMMIT_CONTROL 的初始值,该值可以由在 tpscmt()中重新设置.与与 MACHINES 有关的设置有关的设置:在 MACHINES 中设置每台机器中的全局事务 日志文件的位置和大小.TLOGDEVICE:指定包含 TLOG 文件的 TUXEDO 文件系统
17、名,长度不能超个 64 个字符 TLOGNAME:TLOG 文件的名称 TLOGSIZE:TLOG 文件的大小,它的大小为 0=TLOGSIZE sqlplus internal/oracle 2运行 ORACLE 的安装路径下的/rdbms/admin/xaview.sql SQL d:ora81rdbmsadminxaview.sql 3授权 SQLgrant select on v$xatrans$to public with grant option;SQLgrant select on v$pending_xatrans$to public with grant option;4.用
18、 system 用户(缺省的口令是 manager)连接并授权 SQLconnect system/manager SQLgrant select any table to public;二、二、TUXEDOTUXEDO 的配置的配置 1 修改 TUXEDO 安装路径的 udataobj 目录下的 RM 文件,把以 Oracle_XA:xaosw:开头 的一行用#注释掉,并加入一行:Oracle_XA;xaosw;d:ora81rdbmsxaoraxa8.lib d:ora81precomplibmsvcorasql8.lib 如果是在 UNIX 环境下,则为:Oracle_XA:xaosw:
19、-L$ORACLE_HOME/lib-lclntsh 2.在 TUXEDO 用户下创建 TMS 文件:TMS_ORA8i,TUXEDO 通过 TMS_ORA8i 与 ORACLE 数据 库采用 XA 协议进行通讯 buildtms-o d:tuxedo71binTMS_ORA8i-r Oracle_XA 注意:如果 TUXEDO 服务端与 ORACLE 数据库不在同一台服务器上,可能会提示找不到 库文件 oraxa8.lib 和 orasql8.lib,可到 ORACLE 数据库的服务端相应目录下把这两 个文件拷到当前机器 ORACLE 的客户端下的对应目录下.3.配置 UBBCONFIG 1
20、 在*MACHINES 节中增加:TLOGDEVICE=/home/oracle/temp/simpdb/TLOG TLOGNAME=TLOG TLOGSIZE=200 2.改*GROUPS 节的配置为:(scott/tiger 为本数据库所采用的用户及口令,可根 据需要更改)*GROUPS GROUP1 LMID=simple GRPNO=1 OPENINFO=Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=600+MaxCur=5+LogDir=.TMSNAME=TMS_ORA8i TMSCOUNT=2 修改后的配置文件 ubb 内容如下 IPCKE
21、Y 123456 DOMAINID simpapp MASTER simple MAXACCESSERS 100 MAXSERVERS 50 MAXSERVICES 100 MODEL SHM LDBAL N *MACHINES server LMID=simple APPDIR=d:test TUXCONFIG=d:testtuxconfig TUXDIR=d:tux71 TLOGDEVICE=d:testTLOG TLOGNAME=TLOG TLOGSIZE=100 *GROUPS GROUP1 LMID=simple GRPNO=1 OPENINFO=Oracle_XA:Oracle_X
22、A+Acc=P/scott/tiger+SqlNet=DEMO+SesTm=600+M axCur=5+LogDir=.TMSNAME=TMS_ORA8i TMSCOUNT=2 *SERVERS DEFAULT:CLOPT=-A test SRVGRP=GROUP1 SRVID=1 *SERVICES 说明:说明:OPENINFOOPENINFO 的含义的含义 P:指定用户名与口令,通过该用户名与口令与数据库建立连接,上面的配置 中用户为 scott,口令为 tiger SqlNet:如果 TUXEDO 服务器与数据库服务器不在同一台机器上,TUXEDO 上的 ORACLE 客户端通过网络方式
23、与数据库服务器建立连接,在 OPENINFO 中的 SqlNet 指定该数据库的 SID,如在上面的配置中该数据库 的 SID=DEMO,如果不 SqlNet 指定,在生成的 TRC 文件中会有如下错误:xaolgn_help:XAER_RMERR:OCIServerAttach failer.ORA-12154 ORA-12154:TNS:无法处理服务名 SesTm(Session time limit):maximum time a transaction can be inactive MaxCur:最多可以同时打开多少个 CURSOR 4.重命名下列文件,因为下列文件名与 ORACLE
24、 带的文件名有冲突,所以要改名。1.TUXEDO 安装路径 include 目录下的下面文件 把 sqlca.h 改名为 sqlca.h.bbb 把 sqlcode.h 改名为 sqlcode.h.bbb 把 sqlda.h 改名为 sqlda.h.bbb 2.重命名 TUXEDO 安装路径 lib 目录下的下面文件 把 libsql.lib 改名为 libsql.lib.bbb 5.用 TMADMIN 创建 TLOG 文件,TUXEDO 用一个文件 TLOG 记录对数据库操作的日志。用于协 调分布式数据库的提交与回滚.D:tmadmin crdl-b 500-z d:testTLOG crl
25、og-m simple q 三、服务端的程序:三、服务端的程序:test.pctest.pc 功能:根据客户端传的 EMPNO 到表 EMP 中取 ENAME 的值,并把它返回给客户端#include#include#include EXEC SQL INCLUDE sqlca;EXEC SQL BEGIN DECLARE SECTION;long al_empno=0;char ac_ename11=;EXEC SQL VAR ac_ename IS STRING(11);EXEC SQL END DECLARE SECTION;TEST(TPSVCINFO*rqst)/*接收客户端来的数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TUXEDO 数据库 编程
限制150内