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