userlog(\
if (tperrno == TPEDIAGNOSTIC) { userlog(\ } }
上面的程序采用全局事务,能够实现所要求的业务,
在ENQ中, 执行tpabort()时,原先tpenqueue()中发送到DEMOQ中的消息会被自动从DEMOQ中删除.
在ENQ中, 执行tpabort()时,原先tpdequeue()从DEMOQ中取出的消息会保留再DEMOQ中,不会被自动删除.
tpeuqueue()的调用说明:
如果调用 tpenqueue()的程序当前处于事务模式,并且tpenqueue()中的FLAGS参数没有设置TPNOTRAN,那么tpenqueue()处于当前事务中,如果该事务成功提交,那么tpenqueue()中发送的消息一定在QUEUE中, 如果该事务回滚,那么tpenqueue()中发送的消息一定不会在QUEUE中
如果调用 tpenqueue()的程序当前不处于事务模式,或者tpenqueue()中的FLAGS参数设置
strcpy(reqstr,tpstrerror(tperrno)); tpreturn( TPFAIL, 0, reqstr, 0, 0 );
}
userlog(\strcpy(c_ename,reqstr);
EXEC SQL INSERT INTO TEST values(:c_ename); if(sqlca.sqlcode !=0) {
userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); if(tpabort(0)==-1) {
userlog(\strcpy(reqstr,tpstrerror(tperrno));
}
tpreturn( TPFAIL, 0, reqstr, 0, 0 );
}
if(tpcommit(0) == -1) { userlog(\}
strcpy(reqstr,\
tpreturn( TPSUCCESS, 0, reqstr, 0, 0 );
了TPNOTRAN,那么tpenqueue()不处于当前的事务中,
如果该事务成功提交,那么tpenqueue()中发送的消息一定在QUEUE中, 如果该事务回滚,tpenqueue()中发送到QUEUE中的消息还会保留在QUEUE中,不会被自动从该QUEUE中删除.
对tpdequeue()也是同样的道理.
如果不采用全局事务,如象下面这样写采用本地事务写DEMO.CPP,那么是达不到要求的. 在ENQ中, 执行EXEC SQL ROLLBACK时,原先tpenqueue()中发送到DEMOQ中的消息不会被自动从DEMOQ中删除.还会保留再DEMOQ中
在ENQ中, 执行EXEC SQL ROLLBACK时,原先tpdequeue()从DEMOQ中取出的消息不会被重新保留在DEMOQ中,会被自动删除.
#include
EXEC SQL INCLUDE sqlca;
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
EXEC SQL BEGIN DECLARE SECTION; varchar vc_user[20]; char c_ename[20]; EXEC SQL VAR c_ename EXEC SQL END DECLARE SECTION;
int tpsvrinit(argc, argv) int argc;
char *argv[]; { }
ENQ(TPSVCINFO *rqst) {
//连接数据库
strcpy(vc_user.arr,\vc_user.len=11;
exec sql connect :vc_user; if(sqlca.sqlcode!=0) {
tpreturn(TPFAIL, 0, 0, 0L, 0); }
return 0;
IS STRING(20);
char *reqstr; long len; TPQCTL qctl;
reqstr=rqst->data;
EXEC SQL SELECT ename into :c_ename from EMP where empno=1000; if(sqlca.sqlcode !=0)
{ }
userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); tpreturn( TPFAIL, 0, reqstr, 0, 0 );
qctl.flags = 0;
if (tpenqueue(\{
userlog(\if (tperrno == TPEDIAGNOSTIC) {
printf(\
} strcpy(reqstr,tpstrerror(tperrno)); tpreturn( TPFAIL, 0, reqstr, 0, 0 ); }
EXEC SQL delete from EMP where empno=1000; if(sqlca.sqlcode !=0) { }
EXEC SQL commit release; if(sqlca.sqlcode !=0) {
userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc);
userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); exec sql ROLLBACK; if(sqlca.sqlcode !=0) { }
userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc);
tpreturn( TPFAIL, 0, reqstr, 0, 0 );
}
tpreturn( TPFAIL, 0, reqstr, 0, 0 );
}
strcpy(reqstr,\
tpreturn( TPSUCCESS, 0, reqstr, 0, 0 );
DEQ(TPSVCINFO *rqst) {
char *reqstr; long len;
TPQCTL qctl;
reqstr=rqst->data;
qctl.flags = 0; if (tpdequeue(\\(TPQCTL *)&qctl, (char **)&reqstr,&len, TPNOTIME) == -1)
{ userlog(\ if (tperrno == TPEDIAGNOSTIC) { userlog(\ }
strcpy(reqstr,tpstrerror(tperrno)); tpreturn( TPFAIL, 0, reqstr, 0, 0 );
}
userlog(\strcpy(c_ename,reqstr);
EXEC SQL INSERT INTO TEST values(:c_ename); if(sqlca.sqlcode !=0) {
userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); exec sql ROLLBACK; if(sqlca.sqlcode !=0) { }
userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc);
tpreturn( TPFAIL, 0, reqstr, 0, 0 ); }
EXEC SQL commit release;
}
if(sqlca.sqlcode !=0) {
userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); tpreturn( TPFAIL, 0, reqstr, 0, 0 );
}
strcpy(reqstr,\
tpreturn( TPSUCCESS, 0, reqstr, 0, 0 );
客户端的程序为: #include
int main(int argc, char **argv) { char *reqstr;
long len;
if (tpinit(NULL) == -1) { printf(\ exit(1); }
if ((reqstr = tpalloc(\{ }
printf(\exit(1);
if( (tpcall(\{ }
printf(\tpterm(); exit(1);
printf(\sleep(5);
if( (tpcall(\
}
{ }
printf(\tpterm(); exit(1);
printf(\tpfree(reqstr); tpterm();