Compartir a través de


Compatibilidad con transacciones distribuidas

Los consumidores del proveedor OLE DB de SQL Server Native Client pueden usar el método ITransactionJoin::JoinTransaction para participar en una transacción distribuida coordinada por el Coordinador de transacciones distribuidas de Microsoft (MS DTC).

MS DTC expone objetos COM que permiten a los clientes iniciar y participar en transacciones coordinadas en varias conexiones a una variedad de almacenes de datos. Para iniciar una transacción, el consumidor del proveedor OLE DB de SQL Server Native Client usa la interfaz ITransactionDispenser de MS DTC. El miembro BeginTransaction de ITransactionDispenser devuelve una referencia en un objeto de transacción distribuida. Esta referencia se pasa al proveedor OLE DB de SQL Server Native Client mediante JoinTransaction.

MS DTC admite la confirmación asincrónica y anulación en transacciones distribuidas. Para la notificación sobre el estado de transacción asincrónico, el consumidor implementa la interfaz ITransactionOutcomeEvents y conecta la interfaz a un objeto de transacción MS DTC.

En el caso de las transacciones distribuidas, el proveedor OLE DB de SQL Server Native Client implementa los parámetros ITransactionJoin::JoinTransaction como se indica a continuación.

Parámetro Descripción
punkTransactionCoord Puntero a un objeto de transacción MS DTC.
IsoLevel El proveedor OLE DB de SQL Server Native Client omite. El nivel de aislamiento de las transacciones coordinadas por MS DTC se determina cuando el consumidor adquiere un objeto de transacción de MS DTC.
IsoFlags Debe ser 0. El proveedor OLE DB de SQL Server Native Client devuelve XACT_E_NOISORETAIN si el consumidor especifica otro valor.
POtherOptions Si no es NULL, el proveedor OLE DB de SQL Server Native Client solicita el objeto options desde la interfaz. El proveedor OLE DB de SQL Server Native Client devuelve XACT_E_NOTIMEOUT si el miembro ulTimeout del objeto options no es cero. El proveedor OLE DB de SQL Server Native Client omite el valor del miembro szDescription .

En este ejemplo se coordina la transacción mediante MS DTC.

// Interfaces used in the example.  
IDBCreateSession*       pIDBCreateSession   = NULL;  
ITransactionJoin*       pITransactionJoin   = NULL;  
IDBCreateCommand*       pIDBCreateCommand   = NULL;  
IRowset*                pIRowset            = NULL;  
  
// Transaction dispenser and transaction from MS DTC.  
ITransactionDispenser*  pITransactionDispenser = NULL;  
ITransaction*           pITransaction       = NULL;  
  
    HRESULT             hr;  
  
// Get the command creation interface for the session.  
if (FAILED(hr = pIDBCreateSession->CreateSession(NULL,  
     IID_IDBCreateCommand, (IUnknown**) &pIDBCreateCommand)))  
    {  
    // Process error from session creation. Release any references and  
    // return.  
    }  
  
// Get a transaction dispenser object from MS DTC and  
// start a transaction.  
if (FAILED(hr = DtcGetTransactionManager(NULL, NULL,  
    IID_ITransactionDispenser, 0, 0, NULL,  
    (void**) &pITransactionDispenser)))  
    {  
    // Process error message from MS DTC, release any references,  
    // and then return.  
    }  
if (FAILED(hr = pITransactionDispenser->BeginTransaction(  
    NULL, ISOLATIONLEVEL_READCOMMITTED, ISOFLAG_RETAIN_DONTCARE,  
    NULL, &pITransaction)))  
    {  
    // Process error message from MS DTC, release any references,  
    // and then return.  
    }  
  
// Join the transaction.  
if (FAILED(pIDBCreateCommand->QueryInterface(IID_ITransactionJoin,  
    (void**) &pITransactionJoin)))  
    {  
    // Process failure to get an interface, release any references, and  
    // then return.  
    }  
if (FAILED(pITransactionJoin->JoinTransaction(  
    (IUnknown*) pITransaction, 0, 0, NULL)))  
    {  
    // Process join failure, release any references, and then return.  
    }  
  
// Get data into a rowset, then update the data. Functions are not  
// illustrated in this example.  
if (FAILED(hr = ExecuteCommand(pIDBCreateCommand, &pIRowset)))  
    {  
    // Release any references and return.  
    }  
  
// If rowset data update fails, then terminate the transaction, else  
// commit. The example doesn't retain the rowset.  
if (FAILED(hr = UpdateDataInRowset(pIRowset, bDelayedUpdate)))  
    {  
    // Get error from update, then abort.  
    pITransaction->Abort(NULL, FALSE, FALSE);  
    }  
else  
    {  
    if (FAILED(hr = pITransaction->Commit(FALSE, 0, 0)))  
        {  
        // Get error from failed commit.  
        //  
        // If a distributed commit fails, application logic could  
        // analyze failure and retry. In this example, terminate. The   
        // consumer must resolve this somehow.  
        pITransaction->Abort(NULL, FALSE, FALSE);  
        }  
    }  
  
if (FAILED(hr))  
    {  
    // Update of data or commit failed. Release any references and  
    // return.  
    }  
  
// Un-enlist from the distributed transaction by setting   
// the transaction object pointer to NULL.  
if (FAILED(pITransactionJoin->JoinTransaction(  
    (IUnknown*) NULL, 0, 0, NULL)))  
    {  
    // Process failure, and then return.  
    }  
  
// Release any references and continue.  

Véase también

Transacciones