會話會分隔 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 自變數有效。 不過,如果使用者嘗試執行 語句且版本設定未啟用,且/或資料庫不是只讀,就會發生錯誤。 此外,如果在連接到 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 提供者會從 介面要求 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.