Come posso risolvere l'errore "ERROR: 1023 DETAIL: Violazione di isolamento serializzabile su una tabella in Redshift"?

4 minuti di lettura
0

Se eseguo operazioni simultanee con Amazon Redshift in diverse sessioni, ricevo il messaggio "ERROR: 1023 DETAIL: Violazione dell’isolamento serializzabile su una tabella in Redshift". Come posso risolvere questo errore?

Breve descrizione

Le operazioni di scrittura simultanee in Amazon Redshift devono essere serializzabili. Ciò significa che deve essere possibile eseguire le transazioni in serie in almeno un ordine che produca gli stessi risultati come se le transazioni fossero state eseguite simultaneamente. Per ulteriori informazioni, consulta Isolamento serializzabile.

Per risolvere gli errori di isolamento serializzabile, usa uno o tutti i seguenti metodi:

  • Sposta le operazioni che non devono essere necessariamente incluse nella stessa transazione per l'atomicità, in modo che siano esterne alla transazione
  • Forza la serializzazione bloccando tutte le tabelle di ciascuna sessione
  • Usa l'isolamento dello snapshot per le transazioni simultanee

Soluzione

Sposta le operazioni che non devono essere necessariamente incluse nella stessa transazione per l'atomicità, in modo che siano esterne alla transazione

Usa questo metodo quando singole operazioni all'interno di due transazioni si fanno riferimento a vicenda, in modo da compromettere il risultato dell'altra transazione. Ad esempio, supponiamo che due sessioni avviino una transazione ciascuna:

Session1_Redshift = # BEGIN;
Session2_Redshift = # BEGIN;

il risultato dell'istruzione SELECT in ciascuna transazione potrebbe essere influenzato dall'istruzione INSERT nell'altra. Se eseguita in serie, in qualsiasi ordine, l'istruzione SELECT restituisce sempre una riga in più rispetto a quando le transazioni vengono eseguite contemporaneamente. Poiché non esiste un ordine per cui le operazioni possono essere eseguite in serie producendo lo stesso risultato dell’esecuzione simultanea, l'ultima operazione eseguita genera un errore di isolamento serializzabile:

Session1_redshift=# select * from tab1;
Session1_redshift =# insert into tab2 values (1);
Session2_redshift =# insert into tab1 values (1);
Session2_redshift =# select * from tab2;

Se il risultato delle istruzioni SELECT non è importante (ovvero, l'atomicità delle operazioni nelle transazioni non è importante), sposta le istruzioni SELECT in modo che si trovino al di fuori delle relative transazioni. Ad esempio:

Session1_Redshift=# BEGIN;
Session1_Redshift = # insert into tab1 values (1)
Session1_Redshift = # END;
Session1_Redshift # select * from tab2;
Session2_Redshift # select * from tab1;
Session2_Redshift =# BEGIN;
Session2_Redshift = # insert into tab2 values (1)
Session2_Redshift = # END;

in questi esempi non ci sono riferimenti reciproci nelle transazioni. Le due istruzioni INSERT non si compromettono reciprocamente. Poiché esiste almeno un ordine in cui le transazioni possono essere eseguite in serie producendo lo stesso risultato dell’esecuzione simultanea, le transazioni sono serializzabili.

Forza la serializzazione bloccando tutte le tabelle di ciascuna sessione

Il comando LOCK blocca le operazioni che potrebbero causare errori di isolamento serializzabile. Quando usi il comando LOCK, assicurati di procedere come segue:

  • Blocca tutte le tabelle interessate dalla transazione, comprese quelle interessate dalle istruzioni SELECT di sola lettura all'interno della transazione.
  • Blocca le tabelle nello stesso ordine, indipendentemente da quello in cui vengono eseguite le operazioni.
  • Blocca tutte le tabelle all'inizio della transazione, prima di eseguire qualsiasi operazione.

Usa l'isolamento dello snapshot per le transazioni simultanee

L'opzione SERIALIZZABILE implementa una serializzazione rigorosa, in cui una transazione potrebbe fallire se non è possibile mappare a un’ordine seriale il risultato delle transazioni in esecuzione simultanea.

L'opzione ISOLAMENTO SNAPSHOT consente una maggiore simultaneità, in cui le modifiche simultanee a diverse righe della stessa tabella possono essere completate correttamente.

Le transazioni continuano a funzionare sull'ultima versione salvata, o su uno snapshot, del database.

L'isolamento dello snapshot viene impostato sul database utilizzando il parametro ISOLATION LEVEL nel comando CREATE DATABASE o ALTER DATABASE.

Per visualizzare il modello di simultaneità utilizzato dal database, esegui la seguente query di esempio STV_DB_ISOLATION_LEVEL:

SELECT * FROM stv_db_isolation_level;
The database can then be altered to SNAPSHOT ISOLATION:
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;

Quando modifichi il livello di isolamento di un database, considera quanto segue:

  • Per modificare il livello di isolamento del database, è necessario disporre del privilegio di super utente o di CREATE DATABASE per il database corrente.
  • Non è possibile modificare il livello di isolamento dell'ambiente del database DEV.
  • Non è possibile modificare il livello di isolamento all'interno di un blocco di transazioni.
  • Se altri utenti sono connessi al database, il comando alter isolation level ha esito negativo.
  • Il comando alter isolation level può modificare le impostazioni del livello di isolamento della sessione corrente.

Informazioni correlate

Gestione delle operazioni di scrittura simultanee

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa