Aracılığıyla paylaş


Dağıtılmış hareketleri desteklemek.

SQL Server Yerel istemci OLE DB sağlayıcı tüketicilerin kullanabilmek için ITransactionJoin::JoinTransaction yöntem Microsoft dağıtılmış işlem Coordinator ile (MS DTC) belirlenen bir dağıtılmış işlem katılma.

MS DTC'YI başlatmak ve çeşitli veri depoları için birden çok bağlantı üzerinden Eşgüdümlü hareketleri katılmak, istemcilerin COM nesneleri gösterir.Bir hareketi başlatmak için SQL Server MS DTC yerel istemci OLE DB sağlayıcı ve tüketici kullanır ITransactionDispenser arabirim.The BeginTransaction üye of ITransactionDispenser returns a reference on a dağıtılmış işlem object.Bu başvuru geçirilir SQL Server Kullanarak, yerel istemci OLE DB sağlayıcı JoinTransaction.

MS DTC dağıtılmış hareketleri iptal etmek ve zaman uyumsuz tamamlanma'ı destekler.Zaman uyumsuz işlem durumu hakkında bildirim almak için tüketici uygulayan ITransactionOutcomeEvents arabirim ve arabirimin bir MS DTC işlem nesnesi için bağlanır.

Dağıtılmış hareketleri, SQL Server Yerel istemci OLE DB sağlayıcı uygular ITransactionJoin::JoinTransaction parametreleri aşağıdaki gibi.

Parameter

Açıklama

punkTransactionCoord

Bir MS DTC işlem nesnesi için BIR işaretçi.

IsoLevel

Tarafından dikkate SQL Server Yerel istemci OLE DB sağlayıcı. Bir MS DTC hareket nesneden tüketici edinme yalıtım düzey MS DTC belirlenen işlemler için belirlenir.

IsoFlags

0 Olmalıdır.The SQL Server Native istemci OLE DB sağlayıcı returns XACT_E_NOISORETAIN if any other value is specified by the consumer.

POtherOptions

Değil null ise, SQL Server Yerel istemci OLE DB sağlayıcı seçenekleri nesne arabirimden ister. The SQL Server Native istemci OLE DB sağlayıcı returns XACT_E_NOTIMEOUT if the options object's ulTimeout üye is not zero.The SQL Server Native istemci OLE DB sağlayıcı ignores the value of the szDescription üye.

Bu örnek, MS DTC'yi kullanarak işlemin eşgüdümünü sağlar.

// 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.

See Also

Concepts