Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Livelli di isolamento della transazione in Babelfish
Babelfish supporta i livelli di isolamento delle transazioni READ UNCOMMITTED, READ COMMITTED e SNAPSHOT. A partire da Babelfish versione 3.4 sono supportati i livelli di isolamento aggiuntivi REPEATABLE READ e SERIALIZABLE. Tutti i livelli di isolamento in Babelfish sono supportati con il comportamento dei livelli di isolamento corrispondenti in PostgreSQL. SQL Server e Babelfish utilizzano diversi meccanismi sottostanti per implementare i livelli di isolamento delle transazioni (blocco per l’accesso simultaneo, blocchi eseguiti dalle transazioni, gestione degli errori e così via). Inoltre, ci sono alcune lievi differenze nel modo in cui l’accesso simultaneo può funzionare per carichi di lavoro diversi. Per ulteriori informazioni su questo comportamento di PostgreSQL, consulta Transaction Isolation
Argomenti
Panoramica dei livelli di isolamento delle transazioni
I livelli originali di isolamento delle transazioni di SQL Server si basano su un blocco pessimistico in cui esiste solo una copia dei dati e le query devono bloccare le risorse, ad esempio le righe, prima di accedervi. Successivamente, è stata introdotta una variazione del livello di isolamento READ COMMITTED. Questa variazione consente l’uso di versioni di riga per fornire una migliore simultaneità tra letture e scritture utilizzando un accesso senza blocco. Inoltre, è disponibile un nuovo livello di isolamento chiamato SNAPSHOT. Utilizza inoltre le versioni di riga per fornire una simultaneità migliore rispetto al livello di isolamento REPEATABLE READ, evitando blocchi condivisi sui dati di lettura che vengono conservati fino alla fine della transazione.
A differenza di SQL Server, tutti i livelli di isolamento delle transazioni in Babelfish si basano sul blocco ottimistico (MVCC). Ogni transazione vede uno snapshot dei dati all’inizio dell’istruzione (READ COMMITTED) o all’inizio della transazione (REPEATABLE READ, SERIALIZABLE), indipendentemente dallo stato corrente dei dati sottostanti. Pertanto, il comportamento di esecuzione delle transazioni simultanee in Babelfish potrebbe differire da quello di SQL Server.
Ad esempio, si consideri una transazione con livello di isolamento SERIALIZABLE inizialmente bloccata in SQL Server ma che ha esito positivo in seguito. Potrebbe non riuscire in Babelfish a causa di un conflitto di serializzazione con una transazione simultanea che legge o aggiorna le stesse righe. Potrebbero esserci anche casi in cui l’esecuzione di più transazioni simultanee produce un risultato finale diverso in Babelfish rispetto a SQL Server. Le applicazioni che utilizzano i livelli di isolamento devono essere accuratamente testate negli scenari di concorrenza.
| Livelli di isolamento in SQL Server | Livello di isolamento di Babelfish | Livello di isolamento di PostgreSQL | Commenti |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Entrambi sono basati su snapshot (MVCC) ma non sono esattamente uguali. |
|
|
|
|
Esattamente uguali. |
|
|
|
|
|
|
|
|
|
|
Nota
I suggerimenti della tabella non sono attualmente supportati e il comportamento è controllato utilizzando l’escape hatch predefinito di Babelfish escape_hatch_table_hints.
Impostazione dei livelli di isolamento delle transazioni
Il seguente comando consente di impostare il livello di isolamento delle transazioni:
SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE }
Abilitazione o disabilitazione dei livelli di isolamento delle transazioni
I livelli di isolamento delle transazioni REPEATABLE READ e SERIALIZABLE sono disabilitati per impostazione predefinita in Babelfish ed è necessario abilitarli esplicitamente impostando l’escape hatch babelfishpg_tsql.isolation_level_serializable o babelfishpg_tsql.isolation_level_repeatable_read su pg_isolation utilizzando sp_babelfish_configure. Per ulteriori informazioni, consulta Gestione degli errori di Babelfish con escape hatch.
Di seguito sono riportati alcuni esempi per abilitare o disabilitare l’uso di REPEATABLE READ e SERIALIZABLE nella sessione corrente impostando i rispettivi escape hatch. Facoltativamente, si include il parametro server per impostare l’escape hatch per la sessione corrente e per tutte le nuove sessioni successive.
Per abilitare l’uso di SET TRANSACTION ISOLATION LEVEL REPEATABLE READ solo nella sessione corrente.
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation'
Per abilitare l’uso di SET TRANSACTION ISOLATION LEVEL REPEATABLE READ nella sessione corrente e in tutte le nuove sessioni successive.
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation', 'server'
Per disabilitare l’uso di SET TRANSACTION ISOLATION LEVEL REPEATABLE READ nella sessione corrente e nelle nuove sessioni successive.
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'off', 'server'
Per abilitare l’uso di SET TRANSACTION ISOLATION LEVEL SERIALIZABLE solo nella sessione corrente.
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation'
Per abilitare l’uso di SET TRANSACTION ISOLATION LEVEL SERIALIZABLE nella sessione corrente e in tutte le nuove sessioni successive.
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation', 'server'
Per disabilitare l’uso di SET TRANSACTION ISOLATION LEVEL SERIALIZABLE nella sessione corrente e nelle nuove sessioni successive.
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'off', 'server'