Compatibilidad con transacciones locales en SQL Server Native Client
Se aplica a: SQL Server Azure SQL Database Azure SQL Instancia administrada Azure Synapse Analytics Analytics Platform System (PDW)
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. 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 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 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 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 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 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 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] | 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 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 . 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.