Livelli di isolamento in Amazon Redshift - Amazon Redshift

Amazon Redshift non supporterà più la creazione di nuove UDF Python a partire dal 1º novembre 2025. Se desideri utilizzare le UDF Python, creale prima di tale data. Le UDF Python esistenti continueranno a funzionare normalmente. Per ulteriori informazioni, consulta il post del blog.

Livelli di isolamento in Amazon Redshift

Le operazioni di scrittura simultanee sono supportate in Amazon Redshift in modo protettivo utilizzando i blocchi di scrittura sulle tabelle e il principio di isolamento serializzabile. L'isolamento serializzabile mantiene l'illusione che una transazione in esecuzione su una tabella sia l'unica transazione in esecuzione su quella tabella.

I database Amazon Redshift supportano le operazioni di scrittura simultanee facendo in modo che ogni operazione utilizzi l’ultima versione con commit, o snapshot, dei propri dati all’inizio della transazione. Una snapshot del database viene creata all'interno di una transazione alla prima occorrenza della maggior parte delle istruzioni SELECT, dei comandi DML come COPY, DELETE, INSERT, UPDATE e TRUNCATE e dei seguenti comandi DDL:

  • ALTER TABLE (per aggiungere o eliminare colonne)

  • CREATE TABLE

  • DROP TABLE

  • TRUNCATE TABLE

Nessun’altra transazione è in grado di modificare questo snapshot, il che significa che le transazioni sono isolate l’una dall’altra. In altre parole le transazioni simultanee sono invisibili l’una all’altra e non possono rilevare le modifiche reciproche.

Qualsiasi esecuzione simultanea di transazioni deve produrre gli stessi risultati dell’esecuzione seriale di tali transazioni. Se nessuna esecuzione seriale di tali transazioni produce gli stessi risultati, la transazione che esegue un'istruzione che potrebbe interrompere la serializzabilità viene arrestata e ne viene eseguito il rollback.

Ad esempio, supponiamo che un utente tenti di eseguire due transazioni simultanee, T1 e T2. L’esecuzione di T1 e T2 deve produrre gli stessi risultati di almeno uno degli scenari seguenti:

  • T1 e T2 vengono eseguite in serie in questo ordine

  • T2 e T1 vengono eseguite in serie in questo ordine

I livelli di isolamento in Amazon Redshift prevengono i seguenti problemi:

  • Letture non corrette: una lettura errata si verifica quando una transazione legge dati che non sono ancora stati sottoposti a commit. Ad esempio, supponiamo che la transazione 1 aggiorni una riga. La transazione 2 legge la riga aggiornata prima che T1 esegua il commit dell’aggiornamento. Se T1 esegue il rollback della modifica, T2 ha letto i dati in righe non sottoposte a commit che Amazon Redshift ora ritiene non siano mai esistite.

  • Letture non ripetibili: una lettura non ripetibile si verifica quando una singola transazione legge due volte la stessa riga, ma riceve dati diversi ogni volta. Ad esempio, supponiamo che la transazione 1 legga una riga. La transazione 2 aggiorna o elimina tale riga ed esegue il commit dell’aggiornamento o dell’eliminazione. Se T1 rilegge la riga, recupera valori di riga diversi o scopre che la riga è stata eliminata.

  • Fantasmi: un fantasma è una riga che corrisponde ai criteri di ricerca ma inizialmente non viene visualizzata. Ad esempio, supponiamo che la transazione 1 legga un insieme di righe che soddisfano i criteri di ricerca. La transazione 2 genera una nuova riga in un’istruzione UPDATE o INSERT che corrisponde ai criteri di ricerca per T1. Se T1 esegue nuovamente l’istruzione di ricerca, ottiene un set di righe diverso.

Isolamento SNAPSHOT e SERIALIZABLE

In Amazon Redshift gli isolamenti SERIALIZABLE e SNAPSHOT sono due livelli di isolamento serializzabili.

L’isolamento SNAPSHOT è il livello di isolamento predefinito per la creazione di cluster con provisioning e gruppi di lavoro serverless e consente di elaborare volumi di dati più grandi rispetto all’isolamento SERIALIZABLE in meno tempo.

L’isolamento SERIALIZABLE richiede più tempo, ma implementa vincoli più severi per le transazioni simultanee. Questo livello di isolamento previene problemi come le anomalie di inclinazione della scrittura perché consente il commit di una sola transazione e annulla tutte le altre transazioni simultanee con un errore di violazione dell’isolamento serializzabile.

Di seguito è riportato un esempio cronologico di come verrebbero gestite due operazioni di scrittura simultanee quando utilizzi l’isolamento SNAPSHOT. È consentito eseguire il commit dell’istruzione UPDATE di ogni utente in quanto non crea conflitti se tenti di aggiornare le stesse righe.

Orario Operazione utente 1 Operazione utente 2
1 BEGIN;
2 BEGIN;
3 SELECT * FROM Numbers;

digits
------
0
1
4 SELECT * FROM Numbers;

digits
------
0
1
5 UPDATE Numbers SET digits=0 WHERE digits=1;
6 SELECT * FROM Numbers;

digits
------
0
0
7 COMMIT;
8 Update Numbers SET digits=1 WHERE digits=0;
9 SELECT * FROM Numbers;

digits
------
1
1
10 COMMIT;
11 SELECT * FROM Numbers;

digits
------
1
0
12 SELECT * FROM Numbers;

digits
------
1
0

Se lo stesso scenario viene eseguito utilizzando l'isolamento serializzabile, Amazon Redshift termina l'utente 2 a causa di una violazione della serializzazione e restituisce un errore 1023. Per ulteriori informazioni, consulta Risoluzione degli errori di isolamento serializzabile. In questo caso, solo l'utente 1 può eseguire correttamente il commit.

Considerazioni

Quando utilizzi livelli di isolamento in Amazon Redshift, considera quanto segue:

  • Esegui query sulla vista del catalogo STV_DB_ISOLATION_LEVEL per visualizzare il livello di isolamento utilizzato dal database. Per ulteriori informazioni, consulta STV_DB_ISOLATION_LEVEL.

  • Esegui query sulla vista PG_DATABASE_INFO per visualizzare quante transazioni simultanee sono supportate per il database. Per ulteriori informazioni, consulta PG_DATABASE_INFO.

  • Le tabelle del catalogo di sistema (PG) e altre tabelle di sistema Amazon Redshift non sono bloccate in una transazione. Di conseguenza, le modifiche agli oggetti di database che derivano dalle operazioni di DDL e TRUNCATE sono visibili al commit in qualsiasi transazione simultanea.

    Ad esempio, supponiamo che la tabella A esiste nel database quando iniziano due transazioni simultanee, T1 e T2. Supponiamo che T2 restituisca un elenco di tabelle selezionandole dalla tabella catalogo PG_TABLES. Quindi T1 rilascia la tabella A ed esegue il commit, quindi T2 elenca nuovamente le tabelle. La tabella A non è più elencata. Se T2 prova a eseguire una query sulla tabella rilasciata, Amazon Redshift restituisce un errore di relazione inesistente. La query di catalogo che restituisce l'elenco di tabelle a T2 o verifica che la tabella A esista non è soggetta alle stesse regole di isolamento delle operazioni sulle tabelle utente.

    Le transazioni per gli aggiornamenti a queste tabelle vengono eseguite in modalità di isolamento con lettura sottoposta al commit.

  • Le tabelle del catalogo dei prefissi PG non supportano l’isolamento SNAPSHOT.