Mendukung Transaksi Lokal di SQL Server Native Client

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Sesi memisahkan cakupan transaksi untuk transaksi lokal penyedia SQL Server Native Client OLE DB. Ketika, pada arah konsumen, penyedia SQL Server Native Client OLE DB mengirimkan permintaan ke instans SQL Server yang terhubung, permintaan tersebut merupakan unit kerja untuk penyedia SQL Server Native Client OLE DB. Transaksi lokal selalu membungkus satu atau beberapa unit pekerjaan pada satu sesi penyedia SQL Server Native Client OLE DB.

Menggunakan mode autocommit penyedia SQL Server Native Client OLE DB default, satu unit kerja diperlakukan sebagai cakupan transaksi lokal. Hanya satu unit yang berpartisipasi dalam transaksi lokal. Saat sesi dibuat, penyedia SQL Server Native Client OLE DB memulai transaksi untuk sesi tersebut. Setelah berhasil menyelesaikan unit kerja, pekerjaan akan diterapkan. Jika gagal, setiap pekerjaan yang dimulai digulung balik dan kesalahan dilaporkan kepada konsumen. Dalam kedua kasus, penyedia SQL Server Native Client OLE DB memulai transaksi lokal baru untuk sesi sehingga semua pekerjaan dilakukan dalam transaksi.

Konsumen penyedia SQL Server Native Client OLE DB dapat mengarahkan kontrol yang lebih tepat atas cakupan transaksi lokal dengan menggunakan antarmuka ITransactionLocal . Ketika sesi konsumen memulai transaksi, semua unit kerja sesi antara titik awal transaksi dan panggilan metode Penerapan atau Pembatalan akhirnya diperlakukan sebagai unit atomik. Penyedia SQL Server Native Client OLE DB secara implisit memulai transaksi ketika diarahkan untuk melakukannya oleh konsumen. Jika konsumen tidak meminta retensi, sesi kembali ke perilaku tingkat transaksi induk, yang paling umum mode autocommit.

Penyedia SQL Server Native Client OLE DB mendukung parameter ITransactionLocal::StartTransaction sebagai berikut.

Parameter Deskripsi
isoLevel[in] Tingkat isolasi yang akan digunakan dengan transaksi ini. Dalam transaksi lokal, penyedia SQL Server Native Client OLE DB mendukung hal berikut:

ISOLATIONLEVEL_UNSPECIFIED

ISOLATIONLEVEL_CHAOS

ISOLATIONLEVEL_READUNCOMMITTED

ISOLATIONLEVEL_READCOMMITTED

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_CURSORSTABILITY

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_SERIALIZABLE

ISOLATIONLEVEL_ISOLATED

ISOLATIONLEVEL_SNAPSHOT



Catatan: Dimulai dengan SQL Server 2005 (9.x), ISOLATIONLEVEL_SNAPSHOT valid untuk argumen isoLevel apakah penerapan versi diaktifkan atau tidak untuk database. Namun, kesalahan akan terjadi jika pengguna mencoba menjalankan pernyataan dan penerapan versi tidak diaktifkan dan/atau database tidak bersifat baca-saja. Selain itu, kesalahan XACT_E_ISOLATIONLEVEL akan terjadi jika ISOLATIONLEVEL_SNAPSHOT ditentukan sebagai isoLevel saat terhubung ke versi SQL Server yang lebih lama dari SQL Server 2005 (9.x).
isoFlags[in] Penyedia SQL Server Native Client OLE DB mengembalikan kesalahan untuk nilai apa pun selain nol.
pOtherOptions[in] 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 .
pulTransactionLevel[out] Jika bukan NULL, penyedia SQL Server Native Client OLE DB mengembalikan tingkat transaksi berlapis.

Untuk transaksi lokal, penyedia SQL Server Native Client OLE DB mengimplementasikan parameter ITransaction::Abort sebagai berikut.

Parameter Deskripsi
pboidReason[in] Diabaikan jika diatur. Dapat dengan aman NULL.
fRetaining[in] Ketika TRUE, transaksi baru secara implisit dimulai untuk sesi. Transaksi harus dilakukan atau dihentikan oleh konsumen. Ketika FALSE, penyedia SQL Server Native Client OLE DB kembali ke mode autocommit untuk sesi tersebut.
fAsync[in] Pembatalan asinkron tidak didukung oleh penyedia SQL Server Native Client OLE DB. Penyedia SQL Server Native Client OLE DB mengembalikan XACT_E_NOTSUPPORTED jika nilainya bukan FALSE.

Untuk transaksi lokal, penyedia SQL Server Native Client OLE DB mengimplementasikan parameter ITransaction::Commit sebagai berikut.

Parameter Deskripsi
fRetaining[in] Ketika TRUE, transaksi baru secara implisit dimulai untuk sesi. Transaksi harus dilakukan atau dihentikan oleh konsumen. Ketika FALSE, penyedia SQL Server Native Client OLE DB kembali ke mode autocommit untuk sesi tersebut.
grfTC[in] Pengembalian asinkron dan fase satu tidak didukung oleh penyedia SQL Server Native Client OLE DB. Penyedia SQL Server Native Client OLE DB mengembalikan XACT_E_NOTSUPPORTED untuk nilai apa pun selain XACTTC_SYNC.
grfRM[in] Harus 0.

Kumpulan baris penyedia SQL Server Native Client OLE DB pada sesi dipertahankan pada operasi penerapan lokal atau batalkan berdasarkan nilai properti set baris DBPROP_ABORTPRESERVE dan DBPROP_COMMITPRESERVE. Secara default, properti ini VARIANT_FALSE dan semua kumpulan baris penyedia SQL Server Native Client OLE DB pada sesi hilang setelah operasi pembatalan atau penerapan.

Penyedia SQL Server Native Client OLE DB tidak mengimplementasikan antarmuka ITransactionObject . Konsumen mencoba mengambil referensi pada antarmuka mengembalikan E_NOINTERFACE.

Contoh ini menggunakan ITransactionLocal.

// Interfaces used in the example.  
IDBCreateSession*   pIDBCreateSession   = NULL;  
ITransaction*       pITransaction       = NULL;  
IDBCreateCommand*   pIDBCreateCommand   = NULL;  
IRowset*            pIRowset            = NULL;  
  
HRESULT             hr;  
  
// Get the command creation and local transaction interfaces for the  
// session.  
if (FAILED(hr = pIDBCreateSession->CreateSession(NULL,  
     IID_IDBCreateCommand, (IUnknown**) &pIDBCreateCommand)))  
    {  
    // Process error from session creation. Release any references and  
    // return.  
    }  
  
if (FAILED(hr = pIDBCreateCommand->QueryInterface(IID_ITransactionLocal,  
    (void**) &pITransaction)))  
    {  
    // Process error. Release any references and return.  
    }  
  
// Start the local transaction.  
if (FAILED(hr = ((ITransactionLocal*) pITransaction)->StartTransaction(  
    ISOLATIONLEVEL_REPEATABLEREAD, 0, NULL, NULL)))  
    {  
    // Process error from StartTransaction. Release any references and  
    // 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 terminate.  
    pITransaction->Abort(NULL, FALSE, FALSE);  
    }  
else  
    {  
    if (FAILED(hr = pITransaction->Commit(FALSE, XACTTC_SYNC, 0)))  
        {  
        // Get error from failed commit.  
        }  
    }  
  
if (FAILED(hr))  
    {  
    // Update of data or commit failed. Release any references and  
    // return.  
    }  
  
// Release any references and continue.  

Lihat Juga

Transaksi
Bekerja dengan Isolasi Rekam Jepret