共用方式為


支援本機交易

工作階段會分隔 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 介面,更精確地控制本機交易。當取用者工作階段起始交易時,交易起始點和最終的 CommitAbort 方法呼叫之間的所有工作階段工作單位都會視為一個基本單位。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 引數。不過,如果使用者嘗試執行執行陳述式,而未啟用版本控制且/或資料庫不是唯讀的,則會發生錯誤。此外,如果在連接到早於 SQL Server 2005 的 SQL Server 版本時,將 ISOLATIONLEVEL_SNAPSHOT 指定為 isoLevel,則會發生 XACT_E_ISOLATIONLEVEL 錯誤。

isoFlags[in]

SQL Server Native Client OLE DB 提供者會針對非零的任何值傳回錯誤。

pOtherOptions[in]

如果不是 NULL,SQL Server Native Client OLE DB 提供者會從介面要求選項物件。如果選項物件的 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.