支援本機交易
適用於:SQL Server Azure SQL 資料 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
工作階段會分隔 OLE DB Driver for SQL Server 本機交易的交易範圍。 當 OLE DB Driver for SQL Server 在取用者的指示下,將要求提交給連線的 SQL Server 執行個體時,該要求會構成 OLE DB Driver for SQL Server 的工作單位。 本機交易一律會將一或多個工作單位包裝為單一 OLE DB Driver for SQL Server 工作階段。
使用預設的 OLE DB Driver for SQL Server 自動認可模式時,會將單一工作單位視為本機交易的範圍。 只有一個單位會參與本機交易。 已建立工作階段時,OLE DB Driver for SQL Server 會開始該工作階段的交易。 成功完成工作單位之後,就會認可該工作。 失敗時,系統會回復開始的任何工作,而且會將錯誤回報給取用者。 在任一種情況下,OLE DB Driver for SQL Server 會針對工作階段開始一個新的本機交易,讓所有工作都在交易內進行。
OLE DB Driver for SQL Server 取用者可以使用 ITransactionLocal 介面,更精確地控制本機交易範圍。 當取用者工作階段起始交易時,交易起始點和最終的 Commit 或 Abort 方法呼叫之間的所有工作階段工作單位都會視為一個不可部分完成的單位。 OLE DB Driver for SQL Server 會在取用者的指示下,隱含地開始交易。 如果取用者不要求保留,工作階段會還原到父交易層級的行為,也就是最常見的自動認可模式。
OLE DB Driver for SQL Server 支援 ITransactionLocal::StartTransaction 參數,如下所示。
參數 | 描述 |
---|---|
isoLevel[in] | 與此交易搭配使用的隔離等級。 在本機交易中,OLE DB Driver for SQL Server 支援下列項目: 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] | OLE DB Driver for SQL Server 會針對非零的任何值傳回錯誤。 |
pOtherOptions[in] | 如果不是 NULL,OLE DB Driver for SQL Server 會從介面要求選項物件。 如果選項物件的 ulTimeout 成員不是零,OLE DB Driver for SQL Server 會傳回 XACT_E_NOTIMEOUT。 OLE DB Driver for SQL Server 會忽略 szDescription 成員的值。 |
pulTransactionLevel[out] | 如果不是 NULL,OLE DB Driver for SQL Server 會傳回交易的巢狀層級。 |
針對本機交易,OLE DB Driver for SQL Server 會實作 ITransaction::Abort 參數,如下所示。
參數 | 描述 |
---|---|
pboidReason[in] | 如果設定,則略過。 可以安全地成為 NULL。 |
fRetaining[in] | 當為 TRUE 時,就會針對工作階段隱含地開始新的交易。 此交易必須由取用者認可或結束。 當為 FALSE 時,OLE DB Driver for SQL Server 會還原到工作階段的自動認可模式。 |
fAsync[in] | OLE DB Driver for SQL Server 不支援非同步中止。 如果值不是 FALSE,OLE DB Driver for SQL Server 會傳回 XACT_E_NOTSUPPORTED。 |
針對本機交易,OLE DB Driver for SQL Server 會實作 ITransaction::Commit 參數,如下所示。
參數 | 描述 |
---|---|
fRetaining[in] | 當為 TRUE 時,就會針對工作階段隱含地開始新的交易。 此交易必須由取用者認可或結束。 當為 FALSE 時,OLE DB Driver for SQL Server 會還原到工作階段的自動認可模式。 |
grfTC[in] | OLE DB Driver for SQL Server 不支援非同步和第一階段傳回。 OLE DB Driver for SQL Server 會針對非 XACTTC_SYNC 的任何值傳回 XACT_E_NOTSUPPORTED。 |
grfRM[in] | 必須是 0。 |
工作階段上的 OLE DB Driver for SQL Server 資料列集會根據 DBPROP_ABORTPRESERVE 和 DBPROP_COMMITPRESERVE 資料列集屬性的值,保留在本機認可或中止作業。 根據預設,這些屬性都是 VARIANT_FALSE,而且在中止或認可作業之後,工作階段上的所有 OLE DB Driver for SQL Server 資料列集都會遺失。
OLE DB Driver for SQL Server 不會實作 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.