支援 SQL Server Native Client 中的本機交易
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Platform System (PDW)
會話會分隔 SQL Server Native Client OLE DB 提供者本機交易的交易範圍。 當在取用者的方向,SQL Server Native Client OLE DB 提供者會將要求提交至 SQL Server 連接的實例時,要求會構成 SQL Server Native Client OLE DB 提供者的工作單位。 本機交易一律會在單一 SQL Server Native Client OLE DB 提供者會話上包裝一或多個工作單位。
使用預設的 SQL Server Native Client OLE DB 提供者自動認可模式,會將單一工作單位視為本機交易的範圍。 只有一個單位會參與本機交易。 建立會話時,SQL Server Native Client OLE DB 提供者會開始會話的交易。 成功完成工作單位之後,就會認可該工作。 失敗時,系統會回復開始的任何工作,而且會將錯誤回報給取用者。 不論是哪一種情況,SQL Server Native Client OLE DB 提供者都會開始會話的新本機交易,以便在交易內執行所有工作。
SQL Server Native Client OLE DB 提供者取用 者可以使用 ITransactionLocal 介面,更精確地控制本機交易範圍。 當取用者工作階段起始交易時,交易起始點和最終的 Commit 或 Abort 方法呼叫之間的所有工作階段工作單位都會視為一個不可部分完成的單位。 當取用者導向至交易時,SQL Server Native Client OLE DB 提供者會隱含地開始交易。 如果取用者不要求保留,工作階段會還原到父交易層級的行為,也就是最常見的自動認可模式。
SQL Server Native Client OLE DB 提供者支援 ITransactionLocal::StartTransaction 參數,如下所示。
參數 | 描述 |
---|---|
isoLevel[in] | 與此交易搭配使用的隔離等級。 在本機交易中,SQL Server Native Client OLE DB 提供者支援下列各項: ISOLATIONLEVEL_UNSPECIFIED ISOLATIONLEVEL_CHAOS ISOLATIONLEVEL_READUNCOMMITTED ISOLATIONLEVEL_READCOMMITTED ISOLATIONLEVEL_REPEATABLEREAD ISOLATIONLEVEL_CURSORSTABILITY ISOLATIONLEVEL_REPEATABLEREAD ISOLATIONLEVEL_SERIALIZABLE ISOLATIONLEVEL_ISOLATED ISOLATIONLEVEL_SNAPSHOT 注意:自 SQL Server 2005 (9.x) 起,無論資料庫是否啟用版本控制,ISOLATIONLEVEL_SNAPSHOT 都適用於 isoLevel 引數。 不過,如果使用者嘗試執行執行陳述式,而未啟用版本控制且/或資料庫不是唯讀的,則會發生錯誤。 此外,若連線的 SQL Server 版本早於 SQL Server 2005 (9.x),又將 ISOLATIONLEVEL_SNAPSHOT 指定為 isoLevel,將會發生 XACT_E_ISOLATIONLEVEL 錯誤。 |
isoFlags[in] | SQL Server Native Client OLE DB 提供者會針對零以外的任何值傳回錯誤。 |
pOtherOptions[in] | 如果不是 NULL,SQL Server Native Client OLE DB 提供者會從 介面要求 options 物件。 如果 options 物件的 ulTimeout 成員不是零,SQL Server Native Client OLE DB 提供者會傳回XACT_E_NOTIMEOUT。 SQL Server Native Client OLE DB 提供者會忽略 szDescription 成員的值。 |
pulTransactionLevel[out] | 如果不是 NULL,SQL Server Native Client OLE DB 提供者會傳回交易的巢狀層級。 |
針對本機交易,SQL Server Native Client OLE DB 提供者會實作 ITransaction::Abort 參數,如下所示。
參數 | 描述 |
---|---|
pboidReason[in] | 如果設定,則略過。 可以安全地成為 NULL。 |
fRetaining[in] | 當為 TRUE 時,就會針對工作階段隱含地開始新的交易。 此交易必須由取用者認可或結束。 當為 FALSE 時,SQL Server Native Client OLE DB 提供者會還原為會話的自動認可模式。 |
fAsync[in] | SQL Server Native Client OLE DB 提供者不支援異步中止。 如果值不是 FALSE,SQL Server Native Client OLE DB 提供者會傳回XACT_E_NOTSUPPORTED。 |
針對本機交易,SQL Server Native Client OLE DB 提供者會實作 ITransaction::Commit 參數,如下所示。
參數 | 描述 |
---|---|
fRetaining[in] | 當為 TRUE 時,就會針對工作階段隱含地開始新的交易。 此交易必須由取用者認可或結束。 當為 FALSE 時,SQL Server Native Client OLE DB 提供者會還原為會話的自動認可模式。 |
grfTC[in] | SQL Server Native Client OLE DB 提供者不支援異步和階段一次傳回。 SQL Server Native Client OLE DB 提供者會針對XACTTC_SYNC以外的任何值傳回XACT_E_NOTSUPPORTED。 |
grfRM[in] | 必須是 0。 |
會話上的 SQL Server Native Client OLE DB 提供者數據列集會根據數據列集屬性的值,保留於本機認可或中止作業上,DBPROP_ABORTPRESERVE和DBPROP_COMMITPRESERVE。 根據預設,這些屬性都是VARIANT_FALSE,會話上所有的 SQL Server Native Client OLE DB 提供者數據列集都會在中止或認可作業之後遺失。
SQL Server Native Client OLE DB 提供者不會實 作 ITransactionObject 介面。 取用者在介面上擷取參考的嘗試會傳回 E_NOINTERFACE。
此範例會使用 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.