Share via


Compatibilidad con transacciones locales

Una sesión delimita el ámbito de una transacción local del proveedor OLE DB de SQL Server Native Client. Cuando, por indicació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 contienen una o más unidades de trabajo en una única sesión del proveedor OLE DB de SQL Server Native Client.

En el modo de confirmación automática del proveedor OLE DB de SQL Server Native Client predeterminado, una unidad de trabajo única se trata como el ámbito de una transacción local. Sólo una unidad participa en la transacción local. Cuando se crea una sesión, el proveedor OLE DB de SQL Server Native Client comienza una transacción para la sesión. Cuando se completa correctamente una unidad de trabajo, el trabajo se confirma. En caso de error, cualquier trabajo comenzado se revierte y el error se notifica al consumidor. En cualquiera de los casos, el proveedor OLE DB de SQL Server Native Client comienza una nueva transacción local para la sesión de modo que todo el trabajo se realice dentro de una transacción.

El consumidor del proveedor OLE DB de SQL Server Native Client puede ejercer un control más preciso sobre el ámbito de transacciones locales utilizando la interfaz ITransactionLocal. Cuando una sesión del consumidor inicia una transacción, todas las unidades de trabajo de la sesión entre el punto de inicio de la transacción y las posibles llamadas a los métodos Commit o Abort se tratan como una unidad atómica. El proveedor OLE DB de SQL Server Native Client comienza implícitamente una transacción cuando el consumidor le indica que lo haga. Si el consumidor no solicita la retención, la sesión vuelve al comportamiento de nivel de transacción primaria, la mayoría de las veces en modo de confirmación automática.

El proveedor OLE DB de SQL Server Native Client admite los parámetros ITransactionLocal::StartTransaction del modo siguiente.

Parámetro

Descripción

isoLevel[in]

Nivel de aislamiento que se va a utilizar 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

NotaNota
A partir de SQL Server 2005, ISOLATIONLEVEL_SNAPSHOT es válido para el argumento isoLevel independientemente de que la base de datos tenga habilitado el control de versiones. Sin embargo, se producirá un error si el usuario intenta ejecutar una instrucción y no está habilitado el control de versiones, o si la base de datos no es de sólo lectura. Además, si se especifica ISOLATIONLEVEL_SNAPSHOT como isoLevel estando conectado a una versión de SQL Server anterior a SQL Server 2005, se producirá el error XACT_E_ISOLATIONLEVEL.

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 de opciones de la interfaz. El proveedor OLE DB de SQL Server Native Client devuelve XACT_E_NOTIMEOUT si el miembro ulTimeout del objeto de opciones 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.

Para 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 está establecido. Puede ser sin ningún riesgo NULL.

fRetaining[in]

Si es TRUE, se inicia una nueva transacción de forma implícita para la sesión. La transacción debe ser confirmada o finalizada por el consumidor. Si es FALSE, el proveedor OLE DB de SQL Server Native Client vuelve al modo de confirmación automática para 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.

Para 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]

Si es TRUE, se inicia una nueva transacción de forma implícita para la sesión. La transacción debe ser confirmada o finalizada por el consumidor. Si es FALSE, el proveedor OLE DB de SQL Server Native Client vuelve al modo de confirmación automática para la sesión.

grfTC[in]

El proveedor OLE DB de SQL Server Native Client no admite valores devueltos asincrónicos ni 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 basada en los valores de las propiedades DBPROP_ABORTPRESERVE y DBPROP_COMMITPRESERVE del conjunto de filas. De forma predeterminada, estas dos 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. Si el consumidor intenta recuperar una referencia en la interfaz, obtiene E_NOINTERFACE.

En este ejemplo se utiliza 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.