Share via


Admitir transacciones locales en SQL Server Native Client

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Una sesión delimita el ámbito de transacción de una transacción SQL Server Native Client transacción local del proveedor OLE DB. Cuando, en la dirección de un consumidor, el proveedor OLE DB 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 del proveedor OLE DB de SQL Server Native Client.

Con el valor predeterminado SQL Server Native Client modo de confirmación automática del proveedor OLE DB, 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 SQL Server Native Client proveedor OLE DB inicia 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 cualquier caso, el proveedor OLE DB 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 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 SQL Server Native Client inicia implícitamente una transacción cuando el consumidor lo dirige a hacerlo. 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 parámetros ITransactionLocal::StartTransaction como se indica a continuación.

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



Nota: A partir de SQL Server 2005 (9.x), 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 solo lectura. Además, si se especifica ISOLATIONLEVEL_SNAPSHOT como el valor de isoLevel al conectarse a una versión de SQL Server anterior a SQL Server 2005 (9.x), se producirá el error XACT_E_ISOLATIONLEVEL.
isoFlags[in] El proveedor OLE DB SQL Server Native Client devuelve un error para cualquier valor distinto de cero.
pOtherOptions[in] Si no es NULL, el proveedor OLE DB SQL Server Native Client solicita el objeto options desde la interfaz . El proveedor OLE DB SQL Server Native Client devuelve XACT_E_NOTIMEOUT si el miembro ulTimeout del objeto options no es cero. El proveedor OLE DB SQL Server Native Client omite el valor del miembro szDescription.
pulTransactionLevel[out] Si no es NULL, el SQL Server Native Client proveedor OLE DB 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 de la siguiente manera.

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. Cuando es FALSE, el proveedor OLE DB SQL Server Native Client revierte al modo de confirmación automática de la sesión.
fAsync[in] El proveedor OLE DB no admite SQL Server Native Client la anulación asincrónica. El proveedor OLE DB 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 de la siguiente manera.

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. Cuando es FALSE, el proveedor OLE DB SQL Server Native Client revierte al modo de confirmación automática de la sesión.
grfTC[in] Las devoluciones asincrónicas y de fase uno no son compatibles con el proveedor OLE DB de SQL Server Native Client. El proveedor OLE DB de SQL Server Native Client devuelve XACT_E_NOTSUPPORTED para cualquier valor que no sea XACTTC_SYNC.
grfRM[in] Debe ser 0.

Los SQL Server Native Client conjuntos de filas del proveedor OLE DB de la sesión se conservan en una operación de confirmación o anulación local 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 SQL Server Native Client de la sesión se pierden después de una operación de anulación o confirmación.

El proveedor OLE DB 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 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.  

Consulte también

Transactions
Trabajar con aislamiento de instantánea