Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: OCI define transaction ID problem

Re: OCI define transaction ID problem

From: DriftWood <drift_wood_at_my-deja.com>
Date: Wed, 15 Mar 2000 14:40:42 GMT
Message-ID: <8ao7d8$ltg$1@nnrp1.deja.com>


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");

  OCIServerAttach( srvhp, errhp, (text *) "v8", (sb4) 2, (ub4) OCI_DEFAULT);   printf(" OCIHandleAlloc - OCI_HTYPE_SVCCTX\n");   OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &svchp, (ub4) OCI_HTYPE_SVCCTX,
                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);


/* 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");
  OCIHandleAlloc((dvoid *)envhp, (dvoid **)&usrhp, (ub4) OCI_HTYPE_SESSION,
                (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");

  OCISessionBegin (svchp, errhp, usrhp, OCI_CRED_RDBMS, 0);

  printf(" OCIAttrSet - OCI_ATTR_SESSION\n");   OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX,

                (dvoid *)usrhp, (ub4)0, OCI_ATTR_SESSION, errhp);

  /******************************************************************/

/* allocate transaction handle 1 and set it in the service handle */
  /******************************************************************/
  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);

  /*******************************************************************/

/* start a transaction with global transaction id = [1000, 123, 1] */
  /*******************************************************************/
  gxid.formatID = 1000; /* format id = 1000 */
  gxid.gtrid_length = 3; /* gtrid = 123 */
  gxid.data[0] = 1;
  gxid.data[1] = 2;
  gxid.data[2] = 3;

  gxid.bqual_length = 1; /* bqual = 1 */   gxid.data[3] = 1;

  printf(" OCIAttrSet - OCI_ATTR_XID\n");   OCIAttrSet((dvoid *)txnhp1, OCI_HTYPE_TRANS, (dvoid *)&gxid, sizeof (XID),

                          OCI_ATTR_XID, errhp);

  /*********************************************************************
***/
/* start global transaction 1 with 60 second time to live when
detached */
  /*********************************************************************
***/
  printf("Starting transaction 1\n");
  printf(" OCITransStart\n");
  OCITransStart(svchp, errhp, 60, OCI_TRANS_NEW);
  /*************************************************/

/* update scott.emp empno=7902, increment salary */
  /*************************************************/
  sprintf((char *)sqlstmt, "UPDATE EMP SET SAL = SAL + 1 WHERE EMPNO = 7902");
  printf(" OCIStmtPrepare\n");
  OCIStmtPrepare(stmthp1, errhp, sqlstmt, strlen(sqlstmt), OCI_NTV_SYNTAX, 0);   printf(" OCIStmtExecute - UPDATE EMP SET SAL = SAL + 1 WHERE EMPNO = 7902\n");
  OCIStmtExecute(svchp, stmthp1, errhp, 1, 0, 0, 0, 0);
  /**************************/

/* detach the transaction */
  /**************************/
  printf("     OCITransDetach - transaction 1\n");
  OCITransDetach(svchp, errhp, 0);
  /******************************************************************/

/* allocate transaction handle 2 and set it in the service handle */
  /******************************************************************/
  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);

  /*******************************************************************/

/* start a transaction with global transaction id = [1000, 124, 1] */
  /*******************************************************************/
  gxid.formatID = 1000; /* format id = 1000 */
  gxid.gtrid_length = 3; /* gtrid = 124 */
  gxid.data[0] = 1;
  gxid.data[1] = 2;
  gxid.data[2] = 4;

  gxid.bqual_length = 1; /* bqual = 1 */   gxid.data[3] = 1;

  printf(" OCIAttrSet - OCI_ATTR_XID\n");   OCIAttrSet((dvoid *)txnhp2, OCI_HTYPE_TRANS, (dvoid *)&gxid, sizeof (XID),

                          OCI_ATTR_XID, errhp);

  /*********************************************************************
***/
/* start global transaction 2 with 90 second time to live when
detached */
  /*********************************************************************
***/
  printf("Starting transaction 2\n");
  printf(" OCITransStart\n");
  OCITransStart(svchp, errhp, 90, OCI_TRANS_NEW);
  /*************************************************/

/* update scott.emp empno=7934, increment salary */
  /*************************************************/
  sprintf((char *)sqlstmt, "UPDATE EMP SET SAL = SAL + 1 WHERE EMPNO = 7934");
  printf(" OCIStmtPrepare\n");
  OCIStmtPrepare(stmthp2, errhp, sqlstmt, strlen(sqlstmt), OCI_NTV_SYNTAX, 0);   printf(" OCIStmtExecute - UPDATE EMP SET SAL = SAL + 1 WHERE EMPNO = 7934\n");
  OCIStmtExecute(svchp, stmthp2, errhp, 1, 0, 0, 0, 0);
  /**************************/

/* detach the transaction */
  /**************************/
  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); /*********************************************************************
******/
/* attach to transaction 1, wait for 10 seconds if the transaction is
busy */
/* The wait is clearly not required in this example because no
other */
/* process/thread is using the transaction. It is only for
illustration */
  /*********************************************************************
******/
  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);

  /***************************************************/

/* attach to transaction 2 and commit it */
/* set transaction handle2 into the service handle */
  /***************************************************/
  printf("\nResuming transaction 2\n");
  printf("     OCIAttrSet - OCI_ATTR_TRANS\n");
  OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp2, 0,
                          OCI_ATTR_TRANS, errhp);

  /********************************************************************/

/* 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 */
/* NOT commented out, and make sure Line 1 & Line 2 are commented. */
  /********************************************************************/
//  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
  OCITransRollback(svchp, errhp, (ub4)
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

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US