Share 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, à l'initiative d'un consommateur, le fournisseur OLE DB SQL Server Native Client soumet 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 seule session de fournisseur OLE DB SQL Server Native Client.

À l'aide du mode de validation automatique par défaut du fournisseur OLE DB SQL Server Native Client, une même unité de travail est traitée comme étendue d'une transaction locale. Une seule unité participe à la transaction locale. Quand 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 l'un et l'autre cas, le fournisseur OLE DB SQL Server Native Client commence une nouvelle transaction locale pour la session afin que tout le travail soit effectué au sein d'une transaction.

Le consommateur du fournisseur OLE DB SQL Server Native Client peut obtenir un contrôle plus précis sur l'étendue de la transaction locale en utilisant l'interface ITransactionLocal . Lorsqu'une session de consommateur initialise 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 lorsque le consommateur le lui demande. 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

RemarqueRemarque
Dans SQL Server 2005, ISOLATIONLEVEL_SNAPSHOT est valide pour l'argument isoLevel, que le suivi des versions soit activé ou pas 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.

isoFlags[in]

Le fournisseur OLE DB SQL Server Native Client retourne une erreur pour toute valeur autre que zéro.

pOtherOptions[in]

Si la valeur est différente de NULL, le fournisseur OLE DB SQL Server Native Client demande l'objet d'options de l'interface. Le fournisseur OLE DB SQL Server Native Client retourne XACT_E_NOTIMEOUT si le membre ulTimeout de l'objet d'options est différent de zéro. Le fournisseur OLE DB SQL Server Native Client ignore la valeur du membre szDescription.

pulTransactionLevel[out]

Si la valeur est différente de 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 retourne au 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 retourne au mode de validation automatique pour la session.

grfTC[in]

Les retours asynchrones et en une seule phase 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 de la session sont conservés lors d'une opération de validation ou d'abandon selon les valeurs des propriétés d'ensemble de lignes DBPROP_ABORTPRESERVE et DBPROP_COMMITPRESERVE. Par défaut, ces propriétés sont égales à VARIANT_FALSE et tous les ensembles de lignes du fournisseur OLE DB SQL Server Native Client de la session sont perdus suite à 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.