Supporto delle transazioni locali in SQL Server Native Client
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure azure Synapse Analytics Analytics Platform System (PDW)
Una sessione delimita l'ambito della transazione per una transazione locale del provider OLE DB di SQL Server Native Client. Quando, nella direzione di un consumer, il provider OLE DB di 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 di SQL Server Native Client. Le transazioni locali eseguono sempre il wrapping di una o più unità di lavoro in una singola sessione del provider OLE DB di SQL Server Native Client.
Usando la modalità di commit automatica del provider OLE DB di SQL Server Native Client predefinita, una singola 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 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 di 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 di SQL Server Native Client può indirizzare un controllo più preciso sull'ambito delle transazioni locali 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 chiamate finali al metodo Commit o Abort vengono trattate come un'unità atomica. Il provider OLE DB di SQL Server Native Client avvia in modo implicito una transazione quando viene indirizzata a tale operazione 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 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 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 (9.x), ISOLATIONLEVEL_SNAPSHOT è valido per l'argomento isoLevel indipendentemente dall'abilitazione del controllo delle versioni 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, si verifica l'errore XACT_E_ISOLATIONLEVEL se ISOLATIONLEVEL_SNAPSHOT è specificato come isoLevel quando è stata stabilita una connessione a una versione di SQL Server precedente a SQL Server 2005 (9.x). |
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 dall'interfaccia. Il provider OLE DB di SQL Server Native Client restituisce XACT_E_NOTIMEOUT se il membro ulTimeout dell'oggetto options non è 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 annidato della transazione. |
Per le transazioni locali, il provider OLE DB di 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. Se 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 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. Se FALSE, il provider OLE DB di SQL Server Native Client ripristina la modalità autocommit per la sessione. |
grfTC[in] | I valori restituiti asincroni e di fase uno non sono supportati 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 nella sessione vengono mantenuti 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 entrambe VARIANT_FALSE e tutti i set di righe del provider OLE DB di SQL Server Native Client nella sessione vengono persi dopo un'operazione di interruzione o commit.
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.
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.