Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.misc -> Re: OCI define transaction ID problem
Here is a working sample. If memory serves me the XID struct is defined
in the XA.H (XA header file).
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <oci.h> #include <xa.h>
#pragma comment(lib, "F:\\ORA815\\OCI\\lib\\msvc\\oci.lib")
int main()
{
OCIEnv *envhp;
OCIServer *srvhp;
OCIError *errhp;
OCISvcCtx *svchp;
OCISession *usrhp;
OCIStmt *stmthp1, *stmthp2;
OCITrans *txnhp1, *txnhp2;
dvoid *tmp;
XID gxid;
text sqlstmt[128];
printf("OCIInitialize\n");
OCIInitialize((ub4) OCI_OBJECT, (dvoid *)0, (dvoid * (*)()) 0,
(dvoid * (*)()) 0, (void (*)()) 0 );
printf("Setup and Allocating Handles and set Attributes\n");
printf(" OCIHandleAlloc - OCI_HTYPE_ENV\n");
OCIHandleAlloc( (dvoid *) NULL, (dvoid **) &envhp, (ub4)
OCI_HTYPE_ENV,
0, (dvoid **) &tmp);
printf(" OCIEnvInit\n");
OCIEnvInit( &envhp, (ub4) OCI_DEFAULT, 21, (dvoid **) &tmp );
printf(" OCIHandleAlloc - OCI_HTYPE_ERROR\n"); OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &errhp, (ub4) OCI_HTYPE_ERROR,
52, (dvoid **) &tmp); printf(" OCIHandleAlloc - OCI_HTYPE_SERVER\n");OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &srvhp, (ub4) OCI_HTYPE_SERVER,
52, (dvoid **) &tmp); printf(" OCIServerAttach\n");
52, (dvoid **) &tmp); printf(" OCIHandleAlloc - OCI_HTYPE_STMT\n");OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmthp1, OCI_HTYPE_STMT, 0, 0);
printf(" OCIHandleAlloc - OCI_HTYPE_STMT\n"); OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmthp2, OCI_HTYPE_STMT, 0, 0);
printf(" OCIAttrSet - OCI_ATTR_SERVER\n"); OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp, 0,
OCI_ATTR_SERVER, errhp);OCIHandleAlloc((dvoid *)envhp, (dvoid **)&usrhp, (ub4) OCI_HTYPE_SESSION,
/* set the external name and internal name in server handle */
printf(" OCIAttrSet - OCI_ATTR_EXTERNAL_NAME\n"); OCIAttrSet((dvoid *)srvhp, OCI_HTYPE_SERVER, (dvoid *) "demo", 0, OCI_ATTR_EXTERNAL_NAME, errhp); printf(" OCIAttrSet - OCI_ATTR_INTERNAL_NAME\n"); OCIAttrSet((dvoid *)srvhp, OCI_HTYPE_SERVER, (dvoid *) "txn demo", 0, OCI_ATTR_INTERNAL_NAME, errhp);
/* allocate a user context handle */
printf(" OCIHandleAlloc - OCI_HTYPE_SESSION\n");
(size_t) 0, (dvoid **) 0); printf(" OCIAttrSet - OCI_ATTR_USERNAME\n"); OCIAttrSet((dvoid *)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid *)"scott", (ub4)strlen("scott"), OCI_ATTR_USERNAME, errhp); printf(" OCIAttrSet - OCI_ATTR_PASSWORD\n\n"); OCIAttrSet((dvoid *)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid *)"tiger", (ub4)strlen("tiger"),OCI_ATTR_PASSWORD, errhp); printf(" OCISessionBegin\n");
printf(" OCIAttrSet - OCI_ATTR_SESSION\n"); OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX,
(dvoid *)usrhp, (ub4)0, OCI_ATTR_SESSION, errhp); /******************************************************************/
/******************************************************************/ printf("\nSetup for Transaction 1\n"); printf(" OCIHandleAlloc - OCI_HTYPE_TRANS\n");OCIHandleAlloc((dvoid *)envhp, (dvoid **)&txnhp1, OCI_HTYPE_TRANS, 0, 0);
printf(" OCIAttrSet - OCI_ATTR_TRANS\n"); OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp1, 0,
OCI_ATTR_TRANS, errhp); /*******************************************************************/
/*******************************************************************/ gxid.formatID = 1000; /* format id = 1000 */ gxid.gtrid_length = 3; /* gtrid = 123 */ gxid.data[0] = 1; gxid.data[1] = 2; gxid.data[2] = 3;
printf(" OCIAttrSet - OCI_ATTR_XID\n"); OCIAttrSet((dvoid *)txnhp1, OCI_HTYPE_TRANS, (dvoid *)&gxid, sizeof (XID),
OCI_ATTR_XID, errhp); /************************************************************************/
/************************************************************************/
/*************************************************/
/*************************************************/sprintf((char *)sqlstmt, "UPDATE EMP SET SAL = SAL + 1 WHERE EMPNO = 7902");
/**************************/
/**************************/ printf(" OCITransDetach - transaction 1\n");OCITransDetach(svchp, errhp, 0);
/******************************************************************/
/******************************************************************/ printf("\nSetup for Transaction 2\n"); printf(" OCIHandleAlloc - OCI_HTYPE_TRANS\n");OCIHandleAlloc((dvoid *)envhp, (dvoid **)&txnhp2, OCI_HTYPE_TRANS, 0, 0);
printf(" OCIAttrSet - OCI_ATTR_TRANS\n"); OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp2, 0,
OCI_ATTR_TRANS, errhp); /*******************************************************************/
/*******************************************************************/ gxid.formatID = 1000; /* format id = 1000 */ gxid.gtrid_length = 3; /* gtrid = 124 */ gxid.data[0] = 1; gxid.data[1] = 2; gxid.data[2] = 4;
printf(" OCIAttrSet - OCI_ATTR_XID\n"); OCIAttrSet((dvoid *)txnhp2, OCI_HTYPE_TRANS, (dvoid *)&gxid, sizeof (XID),
OCI_ATTR_XID, errhp); /************************************************************************/
/************************************************************************/
/*************************************************/
/*************************************************/sprintf((char *)sqlstmt, "UPDATE EMP SET SAL = SAL + 1 WHERE EMPNO = 7934");
/**************************/
/**************************/ printf(" OCITransDetach - transaction 2\n");OCITransDetach(svchp, errhp, 0);
/********************************************************/******/
/* Resume transaction 1, increment salary and commit it */
/* Set transaction handle 1 into the service handle */
/********************************************************/ printf("\nResuming transaction 1\n"); printf(" OCIAttrSet - OCI_ATTR_TRANS\n"); OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp1, 0, OCI_ATTR_TRANS, errhp); /*********************************************************************
/********************************************************************* ******/ printf(" OCITransStart - transaction 1\n");OCITransStart(svchp, errhp, 10, OCI_TRANS_RESUME);
printf(" OCIStmtExecute - UPDATE EMP SET SAL = SAL + 1 WHERE
EMPNO = 7902\n");
OCIStmtExecute(svchp, stmthp1, errhp, 1, 0, 0, 0, 0);
printf(" OCITransCommit - Commiting tranacation 1\n"); OCITransCommit(svchp, errhp, (ub4) OCI_DEFAULT);
/***************************************************//* set transaction handle2 into the service handle */
/* attach to transaction 2 and commit it */
/***************************************************/ printf("\nResuming transaction 2\n"); printf(" OCIAttrSet - OCI_ATTR_TRANS\n"); OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp2, 0, OCI_ATTR_TRANS, errhp); /********************************************************************//* NOT commented out, and make sure Line 1 & Line 2 are commented. */
/* To see transaction 2 commited, remove the comments from the */
/* following 2 lines of code (Line 1 & Line 2) and comment */
/* out Line 3 and Line 4. */
/* */
/* To see transaction 2 rolled back, ensure Line 3 and Line 4 are */
/********************************************************************/ // printf(" OCITransCommit - Commiting tranacation 2 \n"); //Line 1 // OCITransCommit(svchp, errhp, (ub4) OCI_DEFAULT); //Line 2 printf(" OCITransRollback - Rolling back tranacation 2\n"); //Line 3
OCI_DEFAULT); //Line 4
Sent via Deja.com http://www.deja.com/
Before you buy.
Received on Wed Mar 15 2000 - 08:40:42 CST
![]() |
![]() |