Bagikan melalui


Mendukung transaksi terdistribusi di SQL Server Native Client

Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Konsumen penyedia SQL Server Native Client OLE DB dapat menggunakan metode ITransactionJoin::JoinTransaction untuk berpartisipasi dalam transaksi terdistribusi yang dikoordinasikan oleh Koordinator Transaksi Terdistribusi Microsoft (MS DTC).

MS DTC mengekspos objek COM yang memungkinkan klien untuk memulai dan berpartisipasi dalam transaksi terkoordinasi di beberapa koneksi ke berbagai penyimpanan data. Untuk memulai transaksi, konsumen penyedia SQL Server Native Client OLE DB menggunakan antarmuka MS DTC ITransactionDispenser . Anggota BeginTransaction ITransactionDispenser mengembalikan referensi pada objek transaksi terdistribusi. Referensi ini diteruskan ke penyedia SQL Server Native Client OLE DB menggunakan JoinTransaction.

MS DTC mendukung penerapan asinkron dan membatalkan transaksi terdistribusi. Untuk pemberitahuan tentang status transaksi asinkron, konsumen mengimplementasikan antarmuka ITransactionOutcomeEvents dan menghubungkan antarmuka ke objek transaksi MS DTC.

Untuk transaksi terdistribusi, penyedia SQL Server Native Client OLE DB mengimplementasikan parameter ITransactionJoin::JoinTransaction sebagai berikut.

Parameter Deskripsi
punkTransactionCoord Penunjuk ke objek transaksi MS DTC.
IsoLevel Diabaikan oleh penyedia SQL Server Native Client OLE DB. Tingkat isolasi untuk transaksi terkoordinasi MS DTC ditentukan ketika konsumen memperoleh objek transaksi dari MS DTC.
IsoFlags Harus 0. Penyedia SQL Server Native Client OLE DB mengembalikan XACT_E_NOISORETAIN jika ada nilai lain yang ditentukan oleh konsumen.
POtherOptions Jika bukan NULL, penyedia SQL Server Native Client OLE DB meminta objek opsi dari antarmuka. Penyedia SQL Server Native Client OLE DB mengembalikan XACT_E_NOTIMEOUT jika anggota ulTimeout objek opsi bukan nol. Penyedia SQL Server Native Client OLE DB mengabaikan nilai anggota szDescription .

Contoh ini mengoordinasikan transaksi dengan menggunakan 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.

Lihat juga