Mendukung Transaksi Lokal
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Sesi memisahkan cakupan transaksi untuk Driver OLE DB untuk transaksi lokal SQL Server. Ketika, pada arah konsumen, Driver OLE DB untuk SQL Server mengirimkan permintaan ke instans SQL Server yang terhubung, permintaan tersebut merupakan unit kerja untuk Driver OLE DB untuk SQL Server. Transaksi lokal selalu membungkus satu atau beberapa unit pekerjaan pada satu Driver OLE DB untuk sesi SQL Server.
Menggunakan Driver OLE DB default untuk mode autocommit SQL Server, satu unit kerja diperlakukan sebagai cakupan transaksi lokal. Hanya satu unit yang berpartisipasi dalam transaksi lokal. Ketika sesi dibuat, Driver OLE DB untuk SQL Server 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, Driver OLE DB untuk SQL Server memulai transaksi lokal baru untuk sesi sehingga semua pekerjaan dilakukan dalam transaksi.
Driver OLE DB untuk konsumen SQL Server 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. Driver OLE DB untuk SQL Server 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.
Driver OLE DB untuk SQL Server mendukung parameter ITransactionLocal::StartTransaction sebagai berikut.
Parameter | Deskripsi |
---|---|
isoLevel[in] | Tingkat isolasi yang akan digunakan dengan transaksi ini. Dalam transaksi lokal, Driver OLE DB untuk SQL Server 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] | Driver OLE DB untuk SQL Server mengembalikan kesalahan untuk nilai apa pun selain nol. |
pOtherOptions[in] | Jika bukan NULL, Driver OLE DB untuk SQL Server meminta objek opsi dari antarmuka. Driver OLE DB untuk SQL Server mengembalikan XACT_E_NOTIMEOUT jika anggota ulTimeout objek opsi bukan nol. Driver OLE DB untuk SQL Server mengabaikan nilai anggota szDescription . |
pulTransactionLevel[out] | Jika tidak NULL, Driver OLE DB untuk SQL Server mengembalikan tingkat transaksi berlapis. |
Untuk transaksi lokal, Driver OLE DB untuk SQL Server 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, Driver OLE DB untuk SQL Server kembali ke mode autocommit untuk sesi tersebut. |
fAsync[in] | Pembatalan asinkron tidak didukung oleh Driver OLE DB untuk SQL Server. Driver OLE DB untuk SQL Server mengembalikan XACT_E_NOTSUPPORTED jika nilainya bukan FALSE. |
Untuk transaksi lokal, Driver OLE DB untuk SQL Server 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, Driver OLE DB untuk SQL Server kembali ke mode autocommit untuk sesi tersebut. |
grfTC[in] | Pengembalian asinkron dan fase satu tidak didukung oleh Driver OLE DB untuk SQL Server. Driver OLE DB untuk SQL Server mengembalikan XACT_E_NOTSUPPORTED untuk nilai apa pun selain XACTTC_SYNC. |
grfRM[in] | Harus 0. |
Driver OLE DB untuk set baris SQL Server 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 Driver OLE DB untuk set baris SQL Server pada sesi hilang setelah operasi pembatalan atau penerapan.
Driver OLE DB untuk SQL Server 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.