Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I livelli di isolamento seguenti sono supportati per le transazioni che accedono a tabelle ottimizzate per la memoria.
ISTANTANEA
LETTURA RIPETIBILE
SERIALIZZABILE
READ COMMITTED (lettura confermata)
Il livello di isolamento delle transazioni può essere specificato come parte del blocco atomico di una stored procedure compilata in modo nativo. Per altre informazioni, vedere CREATE PROCEDURE (Transact-SQL). Quando si accede a tabelle ottimizzate per la memoria da Transact-SQL interpretato, è possibile specificare il livello di isolamento usando hint a livello di tabella.
È necessario specificare il livello di isolamento delle transazioni quando si definisce una stored procedure compilata in modo nativo. È necessario specificare il livello di isolamento negli hint di tabella quando si accede a tabelle ottimizzate per la memoria dalle transazioni utente in Transact-SQL interpretato. Per altre informazioni, vedere Linee guida per i livelli di isolamento delle transazioni con tabelle Memory-Optimized.
Il livello di isolamento READ COMMITTED viene supportato per le tabelle ottimizzate per la memoria con transazioni automaticamente eseguite. READ COMMITTED non è valido nelle transazioni utente o in un blocco atomico. READ COMMITTED non è supportato con transazioni utente esplicite o implicite. Il livello di isolamento READ_COMMITTED_SNAPSHOT è supportato per le tabelle ottimizzate per la memoria con transazioni con commit automatico e solo se la query non accede ad alcuna tabella basata su disco. Inoltre, le transazioni avviate utilizzando Transact-SQL e interpretate con isolamento SNAPSHOT non possono accedere alle tabelle ottimizzate per l'uso della memoria. Le transazioni che vengono utilizzate Transact-SQL interpretate con isolamento REPEATABLE READ o SERIALIZABLE devono accedere alle tabelle ottimizzate per la memoria usando l'isolamento SNAPSHOT. Per altre informazioni su questo scenario, vedere Transazioni tra contenitori.
READ COMMITTED è il livello di isolamento predefinito in SQL Server. Quando il livello di isolamento della sessione è READ COMMITED (o inferiore), è possibile eseguire una delle operazioni seguenti:
Usare in modo esplicito un hint di livello di isolamento più elevato per accedere alla tabella ottimizzata per la memoria (ad esempio WITH (SNAPSHOT)).
Specificare l'opzione
MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOTdel set, che imposterà il livello di isolamento delle tabelle ottimizzate per la memoria su SNAPSHOT (come se venissero inclusi suggerimenti WITH(SNAPSHOT) per ogni tabella ottimizzata per la memoria). Per altre informazioni suMEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT, vedere Opzioni ALTER DATABASE SET (Transact-SQL).
In alternativa, se il livello di isolamento della sessione è READ COMMITTED, è possibile usare le transazioni autocommit.
Le transazioni SNAPSHOT avviate nel contesto interpretato Transact-SQL non possono accedere alle tabelle ottimizzate per la memoria.
I livelli di isolamento delle transazioni supportati per le tabelle ottimizzate per la memoria offrono le stesse garanzie logiche delle tabelle basate su disco. Il meccanismo usato per fornire garanzie a livello di isolamento è diverso.
Per le tabelle basate su disco, la maggior parte delle garanzie del livello di isolamento viene implementata usando il blocco, che impedisce conflitti tramite blocco. Per le tabelle ottimizzate per la memoria, le garanzie vengono applicate usando un meccanismo di rilevamento dei conflitti, che evita la necessità di eseguire blocchi. L'eccezione è l'isolamento SNAPSHOT nelle tabelle basate su disco. Questa operazione viene implementata in modo analogo all'isolamento SNAPSHOT nelle tabelle ottimizzate per la memoria usando un meccanismo di rilevamento dei conflitti.
ISTANTANEA
Questo livello di isolamento specifica che i dati letti da qualsiasi istruzione in una transazione saranno la versione coerente dal punto di vista transazionale dei dati al momento dell'inizio della transazione. La transazione può riconoscere solo le modifiche ai dati che sono stati confermati prima dell'inizio della transazione. Le modifiche ai dati apportate da altre transazioni dopo l'inizio della transazione corrente non sono visibili alle istruzioni in esecuzione nella transazione corrente. Le istruzioni in una transazione ottengono un'istantanea dei dati impegnati così come esistevano all'inizio della transazione.
Le operazioni di scrittura (aggiornamenti, inserimenti ed eliminazioni) sono sempre completamente isolate da altre transazioni. Pertanto, le operazioni di scrittura in una transazione SNAPSHOT possono essere in conflitto con le operazioni di scrittura da altre transazioni. Quando la transazione corrente tenta di aggiornare o eliminare una riga che è stata aggiornata o eliminata da un'altra transazione di cui è stato eseguito il commit dopo l'avvio della transazione corrente, la transazione termina con il messaggio di errore seguente.
Errore 41302. La transazione corrente ha tentato di aggiornare un record nella tabella X che è stato aggiornato dall'avvio della transazione. La transazione è stata interrotta.
Quando la transazione corrente tenta di inserire una riga con lo stesso valore di chiave primaria di una riga inserita da un'altra transazione di cui è stato eseguito il commit prima della transazione corrente, si verifica un errore durante il commit con il messaggio di errore seguente.
Errore 41325. Impossibile eseguire il commit della transazione corrente a causa di un errore di convalida serializzabile.
Se una transazione scrive in una tabella che viene eliminata prima del commit della transazione, la transazione termina con il seguente messaggio di errore:
Errore 41305. Impossibile eseguire il commit della transazione corrente a causa di un errore di convalida di lettura ripetibile.
LETTURA RIPETIBILE
Questo livello di isolamento include le garanzie fornite dal livello di isolamento SNAPSHOT. Inoltre, REPEATABLE READ garantisce che per qualsiasi riga letta dalla transazione, nel momento in cui la transazione esegue il commit, la riga non sia stata modificata da alcuna altra transazione. Ogni operazione di lettura nella transazione è ripetibile fino alla fine della transazione.
Se la transazione corrente ha letto qualsiasi riga che è stata aggiornata da un'altra transazione di cui è stato eseguito il commit prima della transazione corrente, il commit ha esito negativo con il messaggio di errore seguente.
Errore 41305. Impossibile eseguire il commit della transazione corrente a causa di un errore di convalida di lettura ripetibile.
SERIALIZZABILE
Questo livello di isolamento include le garanzie fornite da REPEATABLE READ. Non sono state visualizzate righe fantasma tra lo snapshot e la fine della transazione. Le righe fantasma corrispondono alla condizione di filtro di una selezione, un aggiornamento o un'eliminazione.
La transazione viene eseguita come se non ci siano transazioni simultanee. Tutte le azioni si verificano praticamente in un singolo punto di serializzazione (ora di commit).
Se una di queste garanzie viene violata, la transazione non riesce a eseguire il commit con il messaggio di errore seguente:
Errore 41325. Impossibile eseguire il commit della transazione corrente a causa di un errore di convalida serializzabile.
Vedere anche
Informazioni sulle transazioni nelle tabelle Memory-Optimized
Linee guida per i livelli di isolamento delle transazioni con tabelle Memory-Optimized
Linee guida per la logica di ripetizione dei tentativi per le transazioni nelle tabelle Memory-Optimized