支援本機交易
會話會分隔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 開始,不論是否為資料庫啟用版本設定,ISOLATIONLEVEL_SNAPSHOT是否對isoLevel引數有效。 不過,如果使用者嘗試執行執行陳述式,而未啟用版本控制且/或資料庫不是唯讀的,則會發生錯誤。 此外,如果ISOLATIONLEVEL_SNAPSHOT指定為SQL Server 2005 之前的 SQL Server 版本時,就會發生錯誤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.