Condividi tramite


Supporto delle transazioni locali

Una sessione delimita l'ambito della transazione per una transazione locale del provider OLE DB SQL Server Native Client. Quando, alla direzione di un consumer, il provider OLE DB SQL Server Native Client invia una richiesta a un'istanza connessa di SQL Server, la richiesta costituisce un'unità di lavoro per il provider OLE DB SQL Server Native Client. Le transazioni locali esegue sempre il wrapping di una o più unità di lavoro in una singola sessione del provider OLE DB SQL Server Native Client.

Usando la modalità di gestione automatica del provider OLE DB SQL Server Native Client predefinita, viene considerata un'unica unità di lavoro come ambito di una transazione locale. Solo un unità partecipa alla transazione locale. Quando viene creata una sessione, il provider OLE DB SQL Server Native Client avvia una transazione per la sessione. Al completamento di un'unità, viene eseguito il commit del lavoro. In caso di errore, viene eseguito il rollback di eventuali lavori iniziati e viene segnalato l'errore al consumer. In entrambi i casi, il provider OLE DB SQL Server Native Client avvia una nuova transazione locale per la sessione in modo che tutto il lavoro venga eseguito all'interno di una transazione.

Il consumer del provider OLE DB SQL Server Native Client può indirizzare il controllo più preciso sull'ambito delle transazioni locali usando l'interfaccia ITransactionLocal. Quando una sessione del consumer inizia una transazione, tutte le unità di lavoro della sessione che si trovano tra il punto di inizio della transazione e le chiamate finali al metodo Commit o Abort vengono trattate come un'unità atomica. Il provider OLE DB SQL Server Native Client avvia in modo implicito una transazione quando viene indirizzata a tale scopo dal consumer. Se il consumer non richiede la memorizzazione, la sessione ripristina il comportamento a livello di transazione padre, più comunemente la modalità AutoCommit.

Il provider OLE DB SQL Server Native Client supporta i parametri ITransactionLocal::StartTransaction come indicato di seguito.

Parametro Descrizione
isoLevel[in] Il livello di isolamento da utilizzare con questa transazione. Nelle transazioni locali, il provider OLE DB SQL Server Native Client supporta quanto segue:

- ISOLATIONLEVEL_UNSPECIFIED
- ISOLATIONLEVEL_CHAOS
- ISOLATIONLEVEL_READUNCOMMITTED
- ISOLATIONLEVEL_READCOMMITTED
- ISOLATIONLEVEL_REPEATABLEREAD
- ISOLATIONLEVEL_CURSORSTABILITY
- ISOLATIONLEVEL_REPEATABLEREAD
- ISOLATIONLEVEL_SERIALIZABLE
- ISOLATIONLEVEL_ISOLATED
- ISOLATIONLEVEL_SNAPSHOT Nota: a partire da SQL Server 2005, ISOLATIONLEVEL_SNAPSHOT è valido per l'argomento isoLevel se il controllo delle versioni è abilitato per il database. Se tuttavia l'utente tenta di eseguire un'istruzione e il controllo delle versioni non è abilitato e/o il database non è di sola lettura, si verifica un errore. Inoltre, l'errore XACT_E_ISOLATIONLEVEL si verificherà se ISOLATIONLEVEL_SNAPSHOT viene specificato come isoLevel quando si è connessi a una versione di SQL Server precedente a SQL Server 2005.
isoFlags[in] Il provider OLE DB SQL Server Native Client restituisce un errore per qualsiasi valore diverso da zero.
pOtherOptions[in] In caso contrario, il provider OLE DB SQL Server Native Client richiede l'oggetto opzioni dall'interfaccia. Il provider OLE DB SQL Server Native Client restituisce XACT_E_NOTIMEOUT se il membro ulTimeout dell'oggetto opzioni non è zero. Il provider OLE DB SQL Server Native Client ignora il valore del membro szDescription.
pulTransactionLevel[out] In caso contrario, il provider OLE DB SQL Server Native Client restituisce il livello annidato della transazione.

Per le transazioni locali, il provider OLE DB SQL Server Native Client implementa i parametri ITransaction::Abort come indicato di seguito.

Parametro Descrizione
pboidReason[in] Ignorato se impostato. Può essere NULL.
fRetaining[in] Quando è TRUE, una nuova transazione viene iniziata implicitamente per la sessione. È necessario che il consumer esegua il commit o termini la transazione. Quando FALSE, il provider OLE DB SQL Server Native Client ripristina la modalità di invio automatico per la sessione.
fAsync[in] L'interruzione asincrona non è supportata dal provider OLE DB SQL Server Native Client. Il provider OLE DB SQL Server Native Client restituisce XACT_E_NOTSUPPORTED se il valore non è FALSE.

Per le transazioni locali, il provider OLE DB SQL Server Native Client implementa i parametri ITransaction::Commit come indicato di seguito.

Parametro Descrizione
fRetaining[in] Quando è TRUE, una nuova transazione viene iniziata implicitamente per la sessione. È necessario che il consumer esegua il commit o termini la transazione. Quando FALSE, il provider OLE DB SQL Server Native Client ripristina la modalità di invio automatico per la sessione.
grfTC[in] Le versioni asincrone e di fase uno non sono supportate dal provider OLE DB SQL Server Native Client. Il provider OLE DB SQL Server Native Client restituisce XACT_E_NOTSUPPORTED per qualsiasi valore diverso da XACTTC_SYNC.
grfRM[in] Deve essere 0.

I set di righe del provider OLE DB SQL Server Native Client nella sessione vengono conservati in un'operazione di commit o interruzione locale in base ai valori delle proprietà del set di righe DBPROP_ABORTPRESERVE e DBPROP_COMMITPRESERVE. Per impostazione predefinita, queste proprietà sono sia VARIANT_FALSE che tutti i set di righe del provider OLE DB SQL Server Native Client nella sessione vengono persi seguendo un'operazione di interruzione o commit.

Il provider OLE DB SQL Server Native Client non implementa l'interfaccia ITransactionObject. Un tentativo del consumer di recuperare un riferimento dell'interfaccia restituisce E_NOINTERFACE.

Questo esempio 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.  

Vedere anche

Transazioni
Uso dell'isolamento dello snapshot