Приклад використання MS DTC

MS DTC(координатор розподіленної транзакції) дозволяє виконувати (two/single phase commit) з MSSQL, Sybase і іншими серверами, які вміють працювати з Microsoft DTC. Тепер така можливість зявилася і в Firebird сервера.

// Include MS DTC specific header files. 
//------------------------------------------------------------------------------ 
#define INITGUID 
 
#include "txdtc.h" 
#include "xolehlp.h" 

    ITransactionDispenser *pTransactionDispenser; 
    ITransaction *pTransaction; 

    // Obtain the ITransactionDispenser Interface pointer 
    // by calling DtcGetTransactionManager() 
    DtcGetTransactionManager( NULL,// [in] LPTSTR pszHost, 
			      NULL,// [in] LPTSTR pszTmName, 
			      IID_ITransactionDispenser,// [in] REFIID rid, 
			      0,// [in] DWORDdwReserved1,
			      0, // [in] WORDwcbReserved2, 
			      NULL,// [in] void FAR * pvReserved2, 
			      (void **)&pTransactionDispenser // [out] void** ppvObject 
			      ); 

    // Establish connection to database on server#1 
    LogonToDB( &gSrv1 ); 
  
    // Establish connection to database on server#2 
    LogonToDB( &gSrv2 ); 

    // Initiate an MS DTC transaction 
    pTransactionDispenser->BeginTransaction(  
			      NULL,// [in] IUnknown __RPC_FAR *punkOuter,
			      ISOLATIONLEVEL_ISOLATED,// [in] ISOLEVEL isoLevel, 
			      ISOFLAG_RETAIN_DONTCARE,// [in] ULONG isoFlags, 
			      NULL,// [in] ITransactionOptions *pOptions  
			      &pTransaction// [out] ITransaction **ppTransaction 
			      ); 
 
    // Enlist each of the data sources in the transaction
    SQLSetConnectOption( gSrv1->hdbc, SQL_COPT_SS_ENLIST_IN_DTC, (UDWORD)pTransaction ); 
    SQLSetConnectOption( gSrv2->hdbc, SQL_COPT_SS_ENLIST_IN_DTC, (UDWORD)pTransaction ); 
    
    // Generate the SQL statement to execute on each of the databases 
    sprintf( SqlStatement, 
	     "update authors set address = '%s_%d' where au_id = '%s'",
	      gNewAddress, i, gAuthorID ); 
    
    // Perform updates on both of the DBs participating in the transaction 
    ExecuteStatement( &gSrv1, SqlStatement ); 
    ExecuteStatement( &gSrv2, SqlStatement );
    
    // Commit the transaction  
    hr = pTransaction->Commit( 0, 0, 0 ); 
    // or Rolback the transaction  
    //hr = pTransaction->Abort( 0, 0, 0 );