Partager via


Prise en charge des transactions locales

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

À l’aide du mode de validation automatique par défaut SQL Server Native Client fournisseur OLE DB, 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 démarre une nouvelle transaction locale pour la session afin que tout le travail soit effectué au sein d’une transaction.

Le consommateur SQL Server Native Client fournisseur OLE DB peut diriger un contrôle plus précis sur l’étendue des transactions locales à 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 démarre implicitement une transaction lorsque le consommateur y est invité. 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 : à compter de SQL Server 2005, ISOLATIONLEVEL_SNAPSHOT est valide pour l’argument isoLevel, que le contrôle de version 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. En outre, le XACT_E_ISOLATIONLEVEL d’erreur se produit si ISOLATIONLEVEL_SNAPSHOT est spécifié comme isoLevel lorsqu’il est connecté à une version de SQL Server antérieure à SQL Server 2005.
isoFlags[in] Le fournisseur OLE DB SQL Server Native Client retourne une erreur pour toute valeur autre que zéro.
pOtherOptions[in] Si ce 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 en mode de validation automatique pour 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 en mode de validation automatique pour 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 SQL Server Native Client ensembles de lignes du fournisseur OLE DB sur la session sont conservés lors d’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 VARIANT_FALSE et toutes les SQL Server Native Client ensembles de lignes du fournisseur OLE DB sur la session sont perdus à la suite d’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