Prise en charge des transactions locales dans SQL Server Native Client

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Une session délimite l’étendue de transaction d’une transaction locale du fournisseur OLE DB SQL Server Native Client. Lorsque, dans la direction d’un consommateur, le fournisseur OLE DB SQL Server Native Client envoie une demande à une instance connectée de SQL Server, la demande constitue une unité de travail pour le fournisseur OLE DB SQL Server Native Client. Les transactions locales encapsulent toujours une ou plusieurs unités de travail sur une session de fournisseur OLE DB SQL Server Native Client unique.

À l’aide du mode de validation automatique du fournisseur OLE DB SQL Server Native Client par défaut, une seule unité de travail est traitée comme l’étendue d’une transaction locale. Une seule unité participe à la transaction locale. Lorsqu’une session est créée, le fournisseur OLE DB SQL Server Native Client commence une transaction pour la session. Une fois que l'unité de travail a été exécutée avec succès, le travail est validé. En cas d'échec, tout travail commencé est annulé et l'erreur est signalée au consommateur. Dans les deux cas, le fournisseur OLE DB SQL Server Native Client commence une nouvelle transaction locale pour la session afin que tout le travail soit effectué dans une transaction.

Le consommateur du fournisseur OLE DB SQL Server Native Client peut diriger un contrôle plus précis sur l’étendue de transaction locale à l’aide de l’interface ITransactionLocal . Lorsqu’une session de consommateur démarre une transaction, toutes les unités de travail de la session entre le point de départ de la transaction et les appels éventuels de la méthode Commit ou Abort sont traités comme une unité atomique. Le fournisseur OLE DB SQL Server Native Client commence implicitement une transaction lorsqu’il est dirigé vers le consommateur. Si le consommateur ne demande pas la rétention, la session revient au comportement parent du niveau de la transaction, soit le plus généralement le mode de validation automatique.

Le fournisseur OLE DB SQL Server Native Client prend en charge les paramètres ITransactionLocal ::StartTransaction comme suit.

Paramètre Description
isoLevel[in] Niveau d'isolation à utiliser avec cette transaction. Dans les transactions locales, le fournisseur OLE DB SQL Server Native Client prend en charge les éléments suivants :

ISOLATIONLEVEL_UNSPECIFIED

ISOLATIONLEVEL_CHAOS

ISOLATIONLEVEL_READUNCOMMITTED

ISOLATIONLEVEL_READCOMMITTED

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_CURSORSTABILITY

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_SERIALIZABLE

ISOLATIONLEVEL_ISOLATED

ISOLATIONLEVEL_SNAPSHOT



Remarque : Dans SQL Server 2005 (9.x) et versions ultérieures, ISOLATIONLEVEL_SNAPSHOT est valide pour l’argument isoLevel, que le suivi des versions soit activé ou non pour la base de données. Cependant, une erreur se produit si l'utilisateur essaie d'exécuter une instruction et que le suivi des versions n'est pas activé et/ou que la base de données n'est pas en lecture seule. De plus, l’erreur XACT_E_ISOLATIONLEVEL se produit si ISOLATIONLEVEL_SNAPSHOT est spécifié comme isoLevel lors de la connexion à une version de SQL Server antérieure à SQL Server 2005 (9.x).
isoFlags[in] Le fournisseur OLE DB SQL Server Native Client retourne une erreur pour une valeur autre que zéro.
pOtherOptions[in] S’il n’est pas NULL, le fournisseur OLE DB SQL Server Native Client demande l’objet options à partir de l’interface. Le fournisseur OLE DB SQL Server Native Client retourne XACT_E_NOTIMEOUT si le membre ulTimeout de l’objet options n’est pas égal à zéro. Le fournisseur OLE DB SQL Server Native Client ignore la valeur du membre szDescription .
pulTransactionLevel[out] S’il n’est pas NULL, le fournisseur OLE DB SQL Server Native Client retourne le niveau imbriqué de la transaction.

Pour les transactions locales, le fournisseur OLE DB SQL Server Native Client implémente les paramètres ITransaction ::Abort comme suit.

Paramètre Description
pboidReason[in] Ignoré s'il est défini. Peut être égal à NULL en toute sécurité.
fRetaining[in] Lorsque la valeur est TRUE, une nouvelle transaction est commencée implicitement pour la session. La transaction doit être validée ou terminée par le consommateur. Lorsque la valeur est FALSE, le fournisseur OLE DB SQL Server Native Client revient au mode de validation automatique de la session.
fAsync[in] L’abandon asynchrone n’est pas pris en charge par le fournisseur OLE DB SQL Server Native Client. Le fournisseur OLE DB SQL Server Native Client retourne XACT_E_NOTSUPPORTED si la valeur n’est pas FALSE.

Pour les transactions locales, le fournisseur OLE DB SQL Server Native Client implémente les paramètres ITransaction ::Commit comme suit.

Paramètre Description
fRetaining[in] Lorsque la valeur est TRUE, une nouvelle transaction est commencée implicitement pour la session. La transaction doit être validée ou terminée par le consommateur. Lorsque la valeur est FALSE, le fournisseur OLE DB SQL Server Native Client revient au mode de validation automatique de la session.
grfTC[in] Les retours asynchrones et de phase 1 ne sont pas pris en charge par le fournisseur OLE DB SQL Server Native Client. Le fournisseur OLE DB SQL Server Native Client retourne XACT_E_NOTSUPPORTED pour toute valeur autre que XACTTC_SYNC.
grfRM[in] Doit être égal à 0.

Les ensembles de lignes du fournisseur OLE DB SQL Server Native Client sur la session sont conservés sur une opération de validation ou d’abandon locale en fonction des valeurs des propriétés de l’ensemble de lignes DBPROP_ABORTPRESERVE et DBPROP_COMMITPRESERVE. Par défaut, ces propriétés sont à la fois VARIANT_FALSE et tous les ensembles de lignes du fournisseur OLE DB SQL Server Native Client sur la session sont perdus après une opération d’abandon ou de validation.

Le fournisseur OLE DB SQL Server Native Client n’implémente pas l’interface ITransactionObject . La tentative d'un consommateur pour extraire une référence sur l'interface retourne E_NOINTERFACE.

L’exemple suivant utilise 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.  

Voir aussi

Transactions
Utilisation du niveau d’isolement de capture instantanée