Поддержка локальных транзакций

Сеанс ограничивает область действия локальных транзакций поставщика OLE DB для собственного клиента SQL Server. Если поставщик OLE DB для собственного клиента SQL Server передает в направлении потребителя запрос к подключенному экземпляру SQL Server, этот запрос представляет собой единицу работы поставщика OLE DB для собственного клиента SQL Server. Локальные транзакции всегда содержат одну или несколько единиц работы в одном сеансе поставщика OLE DB для собственного клиента SQL Server.

Используя режим автоматической фиксации, установленный для поставщика OLE DB для собственного клиента SQL Server по умолчанию, одна единица работы рассматривается как область действия локальной транзакции. В локальной транзакции участвует только одна единица работы. При создании сеанса поставщик OLE DB для собственного клиента SQL Server начинает транзакцию для этого сеанса. При успешном завершении единицы работы она фиксируется. При сбое выполняется откат всей начатой работы и потребителю сообщается об ошибке. В любом случае поставщик OLE DB для собственного клиента SQL Server начинает новую локальную транзакцию для сеанса, чтобы выполнить всю работу в транзакции.

Потребитель поставщика OLE DB для собственного клиента SQL Server может более детально управлять областью действия локальной транзакции с помощью интерфейса ITransactionLocal . Если сеанс потребителя инициирует транзакцию, все единицы работы сеанса между точкой начала транзакции и последующими неизбежными вызовами методов Commit или Abort рассматриваются как единая операция. Поставщик OLE DB для собственного клиента SQL Server неявно начинает транзакцию, если этого требует потребитель. Если потребитель не запрашивает хранения, сеанс возвращается в режим родительской транзакции, как правило, это режим автозавершения.

Поставщик OLE DB для собственного клиента SQL Server поддерживает параметры метода ITransactionLocal::StartTransaction следующим образом.

Параметр

Описание

isoLevel[in]

Уровень изоляции, который должен использоваться с этой транзакцией. С локальными транзакциями поставщик OLE DB для собственного клиента 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, уровень изоляции ISOLATIONLEVEL_SNAPSHOT допустим для аргумента isoLevel, независимо от того, включено ли в базе данных управление версиями. Однако произойдет ошибка, если пользователь попытается выполнить инструкцию при отключенном управлении версиями, а база данных предназначена не только для чтения. Кроме того, ошибка XACT_E_ISOLATIONLEVEL возникнет, если для isoLevel задано значение ISOLATIONLEVEL_SNAPSHOT при соединении с версией SQL Server ранее SQL Server 2005.

isoFlags[in]

Поставщик OLE DB для собственного клиента SQL Server возвращает ошибку для ненулевых значений.

pOtherOptions[in]

Если значение не равно NULL, то поставщик OLE DB для собственного клиента SQL Server запрашивает через интерфейс объект параметров. Если элемент объекта параметров ulTimeout не равен нулю, то поставщик OLE DB для собственного клиента SQL Server возвращает XACT_E_NOTIMEOUT. Поставщик OLE DB для собственного клиента SQL Server не учитывает значение элемента szDescription.

pulTransactionLevel[out]

Если значение не равно NULL, поставщик OLE DB для собственного клиента SQL Server возвращает уровень вложенности транзакции.

Для локальных транзакций поставщик OLE DB для собственного клиента SQL Server реализует параметры метода ITransaction::Abort следующим образом.

Параметр

Описание

pboidReason[in]

При установке игнорируется. Может иметь значение NULL.

fRetaining[in]

Если задано значение TRUE, то для сеанса неявным образом запускается новая транзакция. Эта транзакция должна быть зафиксирована или завершена объектом-получателем. Если задано значение FALSE, то поставщик OLE DB собственного клиента SQL Server восстанавливает для сеанса режим автоматической фиксации.

fAsync[in]

Асинхронное аварийное завершение не поддерживается поставщиком OLE DB для собственного клиента SQL Server. Поставщик OLE DB для собственного клиента SQL Server возвращает XACT_E_NOTSUPPORTED, если значение не равно FALSE.

Для локальных транзакций поставщик OLE DB для собственного клиента SQL Server реализует параметры метода ITransaction::Commit следующим образом.

Параметр

Описание

fRetaining[in]

Если задано значение TRUE, то для сеанса неявным образом запускается новая транзакция. Эта транзакция должна быть зафиксирована или завершена объектом-получателем. Если задано значение FALSE, то поставщик OLE DB собственного клиента SQL Server восстанавливает для сеанса режим автоматической фиксации.

grfTC[in]

Асинхронные возвраты и возвраты первого этапа не поддерживается поставщиком OLE DB для собственного клиента SQL Server. Поставщик OLE DB для собственного клиента SQL Server возвращает XACT_E_NOTSUPPORTED, если значение не равно XACTTC_SYNC.

grfRM[in]

Должно быть равно 0.

Наборы строк в сеансе поставщика OLE DB для собственного клиента SQL Server сохраняются в локальной операции фиксации или аварийного завершения на основе значений набора строк свойств DBPROP_ABORTPRESERVE и DBPROP_COMMITPRESERVE. По умолчанию эти свойства имеют значение VARIANT_FALSE в все наборы строк в сеансе поставщика OLE DB для собственного клиента SQL Server теряются после операции фиксации или аварийного завершения.

Поставщик OLE DB для собственного клиента 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.