Поддержка локальных транзакций
Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse Analytics AnalyticsPlatform System (PDW)
Сеанс ограничивает область действия локальных транзакций Microsoft OLE DB Driver for SQL Server Если OLE DB Driver for SQL Server передает в направлении потребителя запрос к подключенному экземпляру SQL Server, этот запрос представляет собой единицу работы OLE DB Driver for SQL Server Локальные транзакции всегда содержат одну или несколько единиц работы в одном сеансе OLE DB Driver for SQL Server
При использовании режима автоматической фиксации, установленного для драйвера OLE DB для SQL Server по умолчанию, одна единица работы рассматривается как область действия локальной транзакции. В локальной транзакции участвует только одна единица работы. При создании сеанса OLE DB Driver for SQL Server начинает транзакцию для этого сеанса. При успешном завершении единицы работы выполненная работа фиксируется. При сбое выполняется откат всей начатой работы; потребителю сообщается об ошибке. В любом случае драйвер OLE DB для SQL Server начинает новую локальную транзакцию для сеанса, чтобы выполнить всю работу в транзакции.
Потребитель драйвера OLE DB для SQL Server может более детально управлять областью действия локальной транзакции с помощью интерфейса ITransactionLocal. Если сеанс потребителя инициирует транзакцию, все рабочие единицы сеанса между точкой начала транзакции и последующими неизбежными вызовами методов Commit или Abort рассматриваются как единая операция. OOLE DB Driver for SQL Server неявно начинает транзакцию, если этого требует потребитель. Если потребитель не запрашивает хранения, сеанс восстанавливает режим родительской транзакции. Как правило, это режим автозавершения.
OLE DB Driver for SQL Server поддерживает параметры метода ITransactionLocal::StartTransaction следующим образом.
Параметр | Description |
---|---|
isoLevel[in] | Уровень изоляции, который должен использоваться с этой транзакцией. В локальных транзакциях OLE DB Driver for 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 возникнет, если для isoLevel задано значение ISOLATIONLEVEL_SNAPSHOT при соединении с версией SQL Server ранее SQL Server 2005 (9.x). |
isoFlags[in] | OLE DB Driver for SQL Server возвращает ошибку для ненулевых значений. |
pOtherOptions[in] | Если значение не равно NULL, то OLE DB Driver for SQL Server запрашивает через интерфейс объект параметров. Если элемент объекта параметров ulTimeout не равен нулю, то OLE DB Driver for SQL Server возвращает XACT_E_NOTIMEOUT. OLE DB Driver for SQL Server игнорирует значение элемента szDescription. |
pulTransactionLevel[out] | Если значение не равно NULL, OLE DB Driver for SQL Server возвращает уровень вложенности транзакции. |
Для локальных транзакций OLE DB Driver для SQL Server реализует параметры метода ITransaction::Abort следующим образом.
Параметр | Description |
---|---|
pboidReason[in] | При установке не учитывается. Может иметь значение NULL. |
fRetaining[in] | Если задано значение TRUE, то для сеанса неявным образом запускается новая транзакция. Эта транзакция должна быть зафиксирована или завершена объектом-получателем. Если задано значение FALSE, то OLE DB Driver for SQL Server восстанавливает для сеанса режим автоматической фиксации. |
fAsync[in] | Асинхронное аварийное завершение не поддерживается OLE DB Driver for SQL Server. OLE DB Driver for SQL Server возвращает XACT_E_NOTSUPPORTED, если значение не равно FALSE. |
Для локальных транзакций OLE DB Driver for SQL Server реализует параметры метода ITransaction::Commit следующим образом.
Параметр | Description |
---|---|
fRetaining[in] | Если задано значение TRUE, то для сеанса неявным образом запускается новая транзакция. Эта транзакция должна быть зафиксирована или завершена объектом-получателем. Если задано значение FALSE, то OLE DB Driver for SQL Server восстанавливает для сеанса режим автоматической фиксации. |
grfTC[in] | Асинхронные возвраты и возвраты на первом этапе не поддерживаются OLE DB Driver for SQL Server. OLE DB Driver for 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 Driver for 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.
См. также:
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по