Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una sesión delimita el ámbito de transacción para una transacción local del proveedor OLE DB de SQL Server Native Client. Cuando, en la dirección de un consumidor, el proveedor OLE DB de SQL Server Native Client envía una solicitud a una instancia conectada de SQL Server, la solicitud constituye una unidad de trabajo para el proveedor OLE DB de SQL Server Native Client. Las transacciones locales siempre encapsulan una o varias unidades de trabajo en una sola sesión de proveedor OLE DB de SQL Server Native Client.
Con el modo predeterminado de confirmación automática del proveedor OLE DB de SQL Server Native Client, una sola unidad de trabajo se trata como el ámbito de una transacción local. Solo una unidad participa en la transacción local. Cuando se crea una sesión, el proveedor OLE DB de SQL Server Native Client inicia una transacción para la sesión. Tras completar correctamente una unidad de trabajo, se confirma el trabajo. En caso de error, se revierte el trabajo iniciado y el error se notifica al consumidor. En cualquier caso, el proveedor OLE DB de SQL Server Native Client inicia una nueva transacción local para la sesión para que todo el trabajo se realice dentro de una transacción.
El consumidor del proveedor OLE DB de SQL Server Native Client puede dirigir un control más preciso sobre el ámbito de transacción local mediante la interfaz ITransactionLocal . Cuando una sesión de consumidor inicia una transacción, todas las unidades de trabajo de sesión entre el punto de inicio de la transacción y las llamadas de método Commit o Abort eventuales se tratan como una unidad atómica. El proveedor OLE DB de SQL Server Native Client inicia implícitamente una transacción cuando el consumidor lo dirige a hacerlo. Si el consumidor no solicita retención, la sesión se revierte al comportamiento de nivel de transacción principal, normalmente en modo de confirmación automática.
El proveedor OLE DB de SQL Server Native Client admite parámetros ITransactionLocal::StartTransaction como se indica a continuación.
| Parámetro | Descripción |
|---|---|
| isoLevel[in] | Nivel de aislamiento que se va a usar con esta transacción. En las transacciones locales, el proveedor OLE DB de SQL Server Native Client admite lo siguiente: - ISOLATIONLEVEL_UNSPECIFIED - ISOLATIONLEVEL_CHAOS - ISOLATIONLEVEL_READUNCOMMITTED - ISOLATIONLEVEL_READCOMMITTED - ISOLATIONLEVEL_REPEATABLEREAD - ISOLATIONLEVEL_CURSORSTABILITY - ISOLATIONLEVEL_REPEATABLEREAD - ISOLATIONLEVEL_SERIALIZABLE - ISOLATIONLEVEL_ISOLATED - ISOLATIONLEVEL_SNAPSHOT Nota: A partir de SQL Server 2005, ISOLATIONLEVEL_SNAPSHOT es válido para el argumento isoLevel si el control de versiones está habilitado o no para la base de datos. Sin embargo, se producirá un error si el usuario intenta ejecutar una instrucción y el control de versiones no está habilitado o la base de datos no es de solo lectura. Además, se producirá el error XACT_E_ISOLATIONLEVEL si ISOLATIONLEVEL_SNAPSHOT se especifica como isoLevel cuando se conecta a una versión de SQL Server anterior a SQL Server 2005. |
| isoFlags[in] | El proveedor OLE DB de SQL Server Native Client devuelve un error para cualquier valor distinto de cero. |
| pOtherOptions[in] | Si no es NULL, el proveedor OLE DB de SQL Server Native Client solicita el objeto options desde la interfaz. El proveedor OLE DB de SQL Server Native Client devuelve XACT_E_NOTIMEOUT si el miembro ulTimeout del objeto options no es cero. El proveedor OLE DB de SQL Server Native Client omite el valor del miembro szDescription . |
| pulTransactionLevel[out] | Si no es NULL, el proveedor OLE DB de SQL Server Native Client devuelve el nivel anidado de la transacción. |
En el caso de las transacciones locales, el proveedor OLE DB de SQL Server Native Client implementa los parámetros ITransaction::Abort como se indica a continuación.
| Parámetro | Descripción |
|---|---|
| pboidReason[in] | Se omite si se establece. Puede ser NULL de forma segura. |
| fRetaining[in] | Cuando es TRUE, se inicia implícitamente una nueva transacción para la sesión. El consumidor debe confirmar o finalizar la transacción. Cuando es FALSE, el proveedor OLE DB de SQL Server Native Client vuelve al modo de confirmación automática de la sesión. |
| fAsync[in] | El proveedor OLE DB de SQL Server Native Client no admite la anulación asincrónica. El proveedor OLE DB de SQL Server Native Client devuelve XACT_E_NOTSUPPORTED si el valor no es FALSE. |
En el caso de las transacciones locales, el proveedor OLE DB de SQL Server Native Client implementa los parámetros ITransaction::Commit como se indica a continuación.
| Parámetro | Descripción |
|---|---|
| fRetaining[in] | Cuando es TRUE, se inicia implícitamente una nueva transacción para la sesión. El consumidor debe confirmar o finalizar la transacción. Cuando es FALSE, el proveedor OLE DB de SQL Server Native Client vuelve al modo de confirmación automática de la sesión. |
| grfTC[in] | El proveedor OLE DB de SQL Server Native Client no admite las devoluciones asincrónicas y de fase uno. El proveedor OLE DB de SQL Server Native Client devuelve XACT_E_NOTSUPPORTED para cualquier valor distinto de XACTTC_SYNC. |
| grfRM[in] | Debe ser 0. |
Los conjuntos de filas del proveedor OLE DB de SQL Server Native Client en la sesión se conservan en una operación local de confirmación o anulación en función de los valores de las propiedades del conjunto de filas DBPROP_ABORTPRESERVE y DBPROP_COMMITPRESERVE. De forma predeterminada, estas propiedades son VARIANT_FALSE y todos los conjuntos de filas del proveedor OLE DB de SQL Server Native Client en la sesión se pierden después de una operación de anulación o confirmación.
El proveedor OLE DB de SQL Server Native Client no implementa la interfaz ITransactionObject . Un consumidor intenta recuperar una referencia en la interfaz devuelve E_NOINTERFACE.
En este ejemplo se usa 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.