Supporto delle transazioni locali
Una sessione delimita l'ambito di una transazione locale per un provider OLE DB di SQL Server Native Client. Quando, su indicazione di un consumer, il provider OLE DB di SQL Server Native Client sottopone una richiesta a un'istanza collegata di SQL Server, la richiesta costituisce un'unità di lavoro per tale provider. Le transazioni locali eseguono sempre il wrapping di una o più di unità di lavoro in un'unica sessione del provider OLE DB di SQL Server Native Client.
Mediante l'uso della modalità AutoCommit predefinita del provider OLE DB di SQL Server Native Client, una sola unità di lavoro viene considerata come ambito di una transazione locale. Solo un unità partecipa alla transazione locale. Quando viene creata una sessione, il provider OLE DB di SQL Server Native Client inizia 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 di SQL Server Native Client inizia una nuova transazione locale per la sessione per consentire l'esecuzione di tutto il lavoro all'interno di una transazione.
Il consumer del provider OLE DB di SQL Server Native Client può eseguire un controllo più preciso sull'ambito della transazione locale tramite 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 eventuali chiamate ai metodi Commit o Abort vengono trattate come un'unità atomica. Il provider OLE DB di SQL Server Native Client inizia implicitamente una transazione in base all'indicazione del 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 di 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 di SQL Server Native Client supporta gli elementi seguenti:
|
isoFlags[in] |
Il provider OLE DB di SQL Server Native Client restituisce un errore per qualsiasi valore diverso da zero. |
pOtherOptions[in] |
Se non è NULL, il provider OLE DB di SQL Server Native Client richiede l'oggetto opzioni all'interfaccia. Il provider OLE DB di SQL Server Native Client restituisce XACT_E_NOTIMEOUT se il membro ulTimeout dell'oggetto opzioni è diverso da zero. Il provider OLE DB di SQL Server Native Client ignora il valore del membro szDescription. |
pulTransactionLevel[out] |
Se non è NULL, il provider OLE DB di SQL Server Native Client restituisce il livello nidificato della transazione. |
Per le transazioni locali il provider OLE DB di SQL Server Native Client implementa i parametri ITransaction::Abort come segue.
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 di SQL Server Native Client ripristina la modalità AutoCommit per la sessione. |
fAsync[in] |
L'interruzione asincrona non è supportata dal provider OLE DB di SQL Server Native Client. Il provider OLE DB di SQL Server Native Client restituisce XACT_E_NOTSUPPORTED se il valore non è FALSE. |
Per le transazioni locali il provider OLE DB di SQL Server Native Client implementa i parametri ITransaction::Commit come segue.
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 di SQL Server Native Client ripristina la modalità AutoCommit per la sessione. |
grfTC[in] |
Le restituzioni asincrone e di prima fase non sono supportate dal provider OLE DB di SQL Server Native Client. Il provider OLE DB di 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 di SQL Server Native Client della sessione vengono mantenuti in caso di interruzione o commit locale in base ai valori delle proprietà del set di righe DBPROP_ABORTPRESERVE e DBPROP_COMMITPRESERVE. Per impostazione predefinita, entrambe queste proprietà sono VARIANT_FALSE e tutti i set di righe del provider OLE DB di SQL Server Native Client della sessione vengono persi in seguito a un'operazione di commit o a un'interruzione.
Il provider OLE DB di SQL Server Native Client non implementa l'interfaccia ITransactionObject. Un tentativo del consumer di recuperare un riferimento dell'interfaccia restituisce E_NOINTERFACE.
In questo esempio viene utilizzato 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.