tuxedo事务控制测试
原因分析:服务里面对数据库进行了插入,修改删除等操作而没有COMMIT或ROLLBACK,tuxedo就会自动开始一个本地事务。tuxedo全局事务会对应一个本地连接的
事务,而上面这种情况下tuxedo又想自动启动一个本地事务。相当于一个单线程程序里面同时启动两个事务,这是不可能出现的,同时只能有一个事务
解决方案:找到tpcall时出这个错误的被调服务程序.
方案1.程序里面使用EXEC SQL COMMIT WORK;或EXEC SQL ROLLBACK;防止tuxedo自动启动一个本地事务
方案2.使用AUTOTRAN=Y,这样这个程序会自动运行在一个全局事务里面,操作也会服务返回就提交
方案3.可用有特殊原因,比如需要多次调用服务后在某种条件发生时才提交,服务调用时使用TPNOTRAN参数.这样当程序退出时,tuxedo会自动提交这个事务
例子1:
ubbconfig
...
*SERVICES
CALLTEST AUTOTRAN=N
客户端没有tpbegin等事务控制
extern "C"
void CALLTEST(TPSVCINFO *rqst)
{
...
userlog("no transtciton");//此时不在事务中
EXEC SQL INSERT TAB_TEST VALUES('111','222');//开始本地事务
userlog("in local transaction");//此时在本地事务中
tpbegin(30,0);//启动全局事务,出现LIBTUX_CAT:481: ERROR: Service xa_start returned -9错误
...
}
例子2:
客户端没有任何tpbegin,tpcommit...
服务端
extern "C"
void CALLTEST(TPSVCINFO *rqst)
{
...
userlog("no transtciton");//此时不在事务中
EXEC SQL INSERT TAB_TEST VALUES('111','222');//开始本地事务
userlog("in local transaction");//此时在本地事务中
...
}
服务调完以后,查询数据库,发现没有数据。tmsutdown 这个服务后,数据被提交到数据库
例子3:
客户端没有tpbegin事务控制
ubbconfig
...
*SERVICES
CALLTEST AUTOTRAN=Y
extern "C"
void CALLTEST(TPSVCINFO *rqst)
{
...
userlog("no transtciton");//全局事务
EXEC SQL INSERT TAB_TEST VALUES('111','222');//不新起事务
userlog("in local transaction");//全局事务
...
}
--转自