[转帖]Tuxedo Quick Start 13 TUXEDO与数据库编程_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4126 | 回复: 0   主题: [转帖]Tuxedo Quick Start 13 TUXEDO与数据库编程        下一篇 
鲲鹏展翅
注册用户
等级:少校
经验:1148
发帖:79
精华:9
注册:2012-11-19
状态:离线
发送短消息息给鲲鹏展翅 加好友    发送短消息息给鲲鹏展翅 发消息
发表于: IP:您无权察看 2012-11-26 9:25:52 | [全部帖] [楼主帖] 楼主

在两层的C/S结构中,客户端直接访问数据库,当采用tuxedo中间件后,形成三层结构。这时,客户端不直接访问数据库,而是改为调用中间件TUXEDO服务端上的服务,由TUXEDO服务端访问数据库,并把结果返回给客户端。

TUXEDO支持ORACLE、SYBASE、INGRES、DB2等UNIX上的大型数据库和NT上的SQL Server,并且还支持C-ISAM文件系统。即可以通过XA协议, 也可不用XA协议与数据库进行连接。在说明TUXEDO与数据库的连接的配置及编程之前,我们先解释一些名词。

名词解释
资源管理器(RESOURCE MANAGER):
最常见的是数据库,可以是其他的,如TUXEDO的QUEUE,EJB的JMS等,它们对数据进行管理和维护.

事务(TRANSACTION):
事务的定义很多,简单地说,事务是对资源管理器的一组操作,它使所涉及的资源管理器从一个状态转变到另一个状态,这些操作要么全部成功,要么全部失败。事务具有以下的4个特征(一般称为ACID):
原子性(ATOMICITY): 指事务中的所有操作作为一个整体单元要么成功要么失败.
一致性(CONSISTENCY):一致性意味着不管事务提交或放弃,参与事务的所以资源管理器
在事务结束后都保持一种合法的状态.一致性也意味着,当一个事务结束时,所有的参
与者都要释放它所锁住的资源.
隔离性(ISOLATION):隔离性意味着事务正在处理过程中,在事务外面无法看到事务处理的
中间结果.
持久性(DURABILITY):使事务的最终结果已被真正写到磁盘系统中.

本地事务(LOCAL TRANSACTION):
如果一个事务只涉及到一个资源管理器,那么该事务称为本地事务。在TUXEDO中,不通过XA接口的事务都是本地事务,如:在ORACLE中,用EXEC CONNECT建立与数据库的连接,并用EXEC COMMIT 提交一个事务,那么该事务就是本地事务.

全局事务(GLOBAL TRANSACTION):
全局事务涉及到一个或多个资源管理器,它也称为分布式事务(DISTRBUTED TRANSACTION),对所有涉及的资源管理器的操作必须被看作单个工作单元。它们必须被同步,并在所有服务器上**完成,否则,就必须被彻底取消。例如:一个服务器在写过程中被关闭,那么事务处理中其他系统上的所有写的东西就必须被取消。在TUXEDO中,采用XA接口的事务都是全局事务。全局事务是相对LT而言的,它也有AICD四个特性,所不同的是它可以跨越多个资源管理器,这些资源管理器可能在不同的平台上。在TUXEDO中,一个全局事务最多可跨越16个不同的资源管理器.

事务管理器(TRANSACTIN MORNITOR):
管理协调参与全局事务的各个资源管理器的准备,提交及回滚等操作,事务管理器还在出现场地故障、网络故障或全局资源死锁时协调全局事务的恢复。TUXEDO在全局事务中就充当事务管理器的作用。在一个全局事务中有一个事务协调器,有一个以上的资源管理器。事务协调器与资源管理器之间采用XA协议进行通讯在TUXEDO中一个GROUP只能有以个资源管理器,所以一个全局事务会跨越多个GROUP

XA协议:
XA协议由TUXEDO首先提出,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准。Informix是最早宣布支持XA协议的数据库厂家,Informix5.0以上的版本都提供XA接口,以实现与TUXEDO的连接。目前,Oracle、Informix、DB2、Sybase等各大数据库厂家都提供对XA的支持.XA协议采用两阶段提交方式来管理分布式事务.XA接口提供资源管理器与事务管理器之间的进行通讯的标准接口,TUXEDO支持基本的XA规范
(PRELIMINARY XA SPECIFICATION),及最终的XA规范(THE 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 中,用XID代替全局事务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中的全局事务有以下特点:
1. 可以在客户端或服务端开始一个全局事务
2. 在TUXEDO中全局事务能跨越多个进程
3. 每个全局事务有一个唯一的ID号(全局事务RID)标识,它可在TUXEDO的进程间传
递。
4. 全局事务可以跨越DOMAIN

一个全局事务从发起到提交的过程:
全局事务的提交采用两阶段提交方式.
在两阶段提交过程中,应用程序是事务提交得发起者,应用程序通过调用TPCOMMIT()开始一个事务的提交,该应用所在GROUP的TMS是这个事务的协调者(COORDINATOR),我们称之为

COORDINATOR TMS,

其他参与本事务的GROUP所对应的TMS,我们称之为:SUBORDINATE TMS,CORDINATOR TMS负责与所有参与本全局事务的RM的通讯.完成该事务的提交,整个过程如下:

1. 应用程序通过调用TPCOMMIT()开始一个事务的提交
2. CORDINATOR TMS给参与该全局事务的每个GROUP中的TMS发送请求,每个TMS要
求RM进行预提交操作
3. 每个RM各自进行预提交,预提交指把要更改的数据写到磁盘上,以便在失败时可以进行
恢复.但没有真正更新RM
4. 当RM预提交完毕,每个SUBORDINATE TMS都把预提交操作结果(成功或失败)告诉给
COORDINATOR TMS,
5. 如果有任何一个RM预提交失败,或COORDINATOR TMS得不到它的应答,那么
COORDINATOR TMS告诉所有的RM回滚它们各自的本地事务.
如果所有的RM预提交都成功,那么COORDINATOR TMS在它所在机器的TLOG文件中
写一条记录,内容包括该全局事务的全局事务RID,参与该全局事务的所以RM的列表及
其他信息.以便在第二阶段提交失败时回滚.
6.下一步做什么取决于在UBBCONFIG中TP_COMMIT_CONTROL得设置

TP_CMT_LOGGED


TPCOMMIT()调用返回,程序继续往下走,各个RM各自进行真正得提交操作,如果在第二阶段提交失败,TMS时是不知道的.而这是TPCOMMIT()已返回成功.

TP_CMT_COMPLETE


TPCOMMIT()会等到第二阶段提交完成才返回,如果在第二阶段提交失败,TMS是知道的.
并且TPCOMMIT()会返回失败. 默认值是TP_CMT_COMPLETE

事务模式和非事务模式:
TUXEDO的应用程序可分为两种,事务模式和非事务模式,有以下两种方式可以使一个TUXEDO应用处于事务模式下:
1.显式:  通过调用tpbegin(),显式开始一个全局事务
2.隐式:  在UBBCONFIG中对一个SERVICE 设置了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没有设置TPNOTRAN(默认方式是不设置)那么SERVICE:B参与当前的事务。
2.        如果tpcall()中的flags为TPNOTRAN,那么SERVICE:B不参与当前的事务。

注意:如果在UBBCONFIG中对SERVICE B设置了AUTOTRAN=Y,那么当前的事务被自动挂起,系统为B自动起一个新的事务,如果B中的事务失败了,对A中的事务没有影响。

TUXEDO中与全局事务有关的设置:
与全局事务有关的设置包括:RESOURCE,MACHINE,GROUPS,SERVICE 4个节
在RESOURCE中设置主要有:

MAXGTT(MAX Global Transaction)


在任一时刻在某一台服务器上最多可以有多少个全局事务存在,也就是可以最多有多少个未提交的全局事务,范围:0-32767。0意味着该系统不支持事务,默认值是100.该值也可在MACHIENS中设置。在MACHINES中设置的值回覆盖在RESOURCE中的设置值。

GTT(Global Transaction Table)


TUXEDO在BULLETIN BOARD中维护的一张表,用于记录全局事务的状态信息,在该台服务器上发起的或该台服务器参与的每个全局事务,在GTT中都对应一条记录.每台服务器的GTT中最多可以有多少条全局事务的记录是由MAXGTT决定的,当一个全局事务成功提交时,它在GTT中的记录将被删除.如果该全局事务提交失败,它在GTT中的记录还会保持一段时间,一般是5分钟.所以GTT应该大于TLOGSIZE。GTT的范围为0-64,000,默认值为100,可以在MACHINE中覆盖该设置.

CMTRET:


设置TP_COMMIT_CONTROL的初始值,该值可以由在tpscmt()中重新设置.

与MACHINES有关的设置:
在MACHINES中设置每台机器中的全局事务 日志文件的位置和大小.

TLOGDEVICE:


指定包含TLOG文件的TUXEDO 文件系统名,长度不能超个64个字符

TLOGNAME:


TLOG文件的名称

TLOGSIZE:


TLOG文件的大小,它的大小为0 <= TLOGSIZE <= 2048,默认值为100
如果一个全局事务跨越多台服务器,在每台服务器上都应该有一个TLOG文件,用于记录全局事务的信息,在全局事务要回滚时要用到记录在TLOG中的信息.TLOG可以创建在裸设备上.如果一个全局事务在该台机器上发起但还没有提交,那么它在TLOG文件种占有一页的空间,在一般的平台上一页的大小使512字节,,当该全局事务成功提交或回滚后,它在TLOG中的记
录将被删除。

与GROUPS有关的设置:
在TUXEDO中一个GROUP中只能定义一个资源管理器,如果一个TUXEDO系统有多个资源管理器,就要定义多个GROUP才行.在GROUP中定义TMS的名称及个数,打开,关闭该资源管理器的参数,不同的资源管理器的设置都不一样.

SERVICES中的设置:

AUTOTRAN:


如果一个客户端调用了设置AUTOTRAN=Y的SERVICE,并且该客户端当前不在事务模式下,那么TUXEDO自动为该SERVICE启动一个全局事务.

TRANSTIME:


对因设置了AUTOTRAN的而起动的事务设置超时时间.默认为30秒,0表示没有超时。

全局事务中用到的函数
在TUXEDO中有两套操作全局事务的函数

ATMI


    TUXEDO自己提供的函数

TX


    由X/OPEN定义的函数
它们基本差不多,因为TX是以ATMI为基础定义的.区别
1.        TX提供 CHAINED TRANSACTIONS,ATMI不提供
2.        TX以tx_开始,而ATMI以tp开始,如tx_begin(),tpbegin()
3.        TX在tx.h中定义,ATMI在atmi.h中定义

TX_开头的函数一般很少用,在此不作介绍。

int tpopen(void)


描述:建立与一个资源管理器得连接,该资源管理器是该SERVER所在得组中定义的.并且在buildserver时要用 -r 参数指定该资源管理器.如果采用默认的TPSVRINIT()该函数会自动被调用。
参数:无
返回值:失败返回-1, 错误号保存在全局变量tperrno中。

int tpclose(void)


描述:关闭与一个资源管理器得连接,如果采用默认的TPDONE()该函数会自动被调用,
参数:无
返回值:失败返回-1,错误号保存在全局变量tperrno中。

int tpbegin(unsigned long timeout, long flags)


描述:开始一个全局事务
参数:
timeout:全局事务的超时时间,从tpbegin()开始,过了TIMEOUT秒该全局事务还没有完成,
该全局事务将因超时而回滚,范围为0 to 2 31 -1秒, 0表示可以为无穷长。注
意:TIMEOUT应该大于SCANUNIT
FLAGS:保留值,现在没有用到,要设为0
返回值:失败返回-1,错误号保存在全局变量tperrno中。

int tpcommit(long flags)


描述:对一个全局事务进行提交操作
参数:FLAG应该设为0
返回值:失败返回-1,错误号保存在全局变量tperrno中。

int tpabort(long flags)


描述:对当前的全局事务进行回滚
参数:FLAG应该设为0
返回值:失败返回-1,错误号保存在全局变量tperrno中。

int tpsuspend(TPTRANID *tranid, long flags)


描述:挂起当前的全局事务,一个全局事务的发起进程A可以调用它,并把得到的句柄传给在同一台机器上另一个进程B,在B中可以调研TPRESUME()重起该全局事务.如果不是在一个全局事务的发起进程中调用TPSUSPEND(),那么只能在进程中调用TPRESUME().
注意:一个全局事务被挂起之后,超时仍然起作用.
参数:
tranid:如果调用成功,返回一个当前全局事务的句柄
FLAG应该设为0
返回值:失败返回-1, 错误号保存在全局变量tperrno中。
成功返回一个当前全局事务的句柄,

int tpresume(TPTRANID *tranid, long flags)


描述:重新开始一个全局事务
参数:
tranid:要重新开始的全局事务的句柄,为tpsuspend()中参数tranid返回值
flags: 应该设为0
返回值:失败返回-1,错误号保存在全局变量tperrno中。

int tpscmt(long flags) ()


描述:设置TP_COMMIT_CONTROL得值
参数:FLAG有两个值
      TP_CMT_LOGGED: TPCOMMIT()在第一阶段完成之后就返回.
      TP_CMT_COMPLETE:TPCOMMIT()在第二阶段完成之后才返回.
返回值:失败返回-1,错误号保存在全局变量tperrno中。

int tpgetlev()


描述:返回当前所处得全局事务状态.
参数:
返回值:1:在一个全局事务中,0:不在一个全局事务中,
失败返回-1,错误号保存在全局变量tperrno中。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论