4.2.4.MS DTC ODBC Sample Application

The MS DTC demo is located in the

<VIRTUOSO_INSTALLATION_DIRECTORY>\samples\odbc\MSDTCdemo1

folder. This demo shows usage of distributed transactions driven by MS DTC through the ODBC API.

Setup

The sample works with two instances of Virtuoso server. The running MS DTC service is needed. The servers must be started with MS DTC support (see Virtuoso documentation).

First of all, edit the virt.odbc file. By default this file contains two connection strings of local Virtuoso servers running on port 1111 and port 1112, Each line begins with connection string to appropriate Virtuoso server. Initially this file contains the following lines:

1111 dba dba 00.sql
1112 dba dba 01.sql 
                     

where 1111, 1112 are ports of two Virtuoso servers. "dba dba" - user and password.

Initialization

Start

 mtstest.exe +load 

in the

<VIRTUOSO_INSTALLATION_DIRECTORY>\samples\odbc\MSDTCdemo1

folder. This must check whether all needed servers are running, create and initialize tables, procedures, etc.

Test

Run the command in the demo's working directory:

 
mtstest.exe   +exec N
mtstest.exe   +exec 0
                 

where N - is a number of test iterations. The second command checks logical consistency of the tables.

Description

The demo source is

start.c

file in the

<VIRTUOSO_INSTALLATION_DIRECTORY>\samples\odbc\MSDTCdemo1

directory. Several highlights of the most significant parts of code are presented below:

  ITransactionDispenser *disp;
  ITransaction *transaction;

  ...
  HRESULT hr =
      DtcGetTransactionManagerC (0, 0, &IID_ITransactionDispenser, 0, 0, 0,
      &, disp);
                 

The code above creates Dispenser object which represents the local instance of MS DTC. If MS DTC is not available

DtcGetTransactionManagerC

fails. The Dispenser is needed to create distributed transaction objects later.

Begin new distributed transaction:

disp->lpVtbl->BeginTransaction (disp, 0, ISOLATIONLEVEL_ISOLATED,
      0, 0, &transaction);               
                 

Enlist connection in the transaction:

SQLSetConnectOption (hdbc, SQL_COPT_SS_ENLIST_IN_DTC,
      (DWORD) transaction);
                 

And, finally, commit the transaction:

transaction->lpVtbl->Commit (tran, 0, 0, 0);