Поддержка локальных транзакций в собственном клиенте SQL Server
Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)
Область транзакций разделителя сеанса для локальной транзакции поставщика 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 (9.x), ISOLATIONLEVEL_SNAPSHOT допустимо для аргумента isoLevel , включена ли версия для базы данных. Однако произойдет ошибка, если пользователь попытается выполнить инструкцию, когда управление версиями не включено, а база данных предназначена не только для чтения. Кроме того, ошибка XACT_E_ISOLATIONLEVEL возникает, если ISOLATIONLEVEL_SNAPSHOT указан как isoLevel при подключении к версии SQL Server ранее, чем SQL Server 2005 (9.x). |
isoFlags[in] | Поставщик OLE DB собственного клиента SQL Server возвращает ошибку для любого значения, отличного от нуля. |
pOtherOptions[in] | В противном случае поставщик OLE DB собственного клиента SQL Server запрашивает объект параметров из интерфейса. Поставщик OLE DB собственного клиента SQL Server возвращает XACT_E_NOTIMEOUT, если элемент ulTimeout объекта ulTimeout не равен нулю. Поставщик OLE DB собственного клиента SQL Server игнорирует значение члена szDescription . |
pulTransactionLevel[out] | В противном случае поставщик OLE DB собственного клиента SQL Server возвращает вложенный уровень транзакции. |
Для локальных транзакций поставщик OLE DB собственного клиента SQL Server реализует параметры ITransaction::Abort следующим образом.
Параметр | Описание |
---|---|
pboidReason[in] | При установке не учитывается. Может иметь значение NULL. |
fRetaining[in] | Если задано значение TRUE, то для сеанса неявным образом запускается новая транзакция. Эта транзакция должна быть зафиксирована или завершена объектом-получателем. Если значение FALSE, поставщик OLE DB SQL Server Native Client возвращается к режиму автоматического подключения для сеанса. |
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 Native Client возвращается к режиму автоматического подключения для сеанса. |
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.