Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Come posso risolvere gli errori "Serializable isolation violation on table" o "Relation does not exist" in Amazon Redshift?
Quando eseguo operazioni concorrenti in sessioni diverse di Amazon Redshift, ricevo un errore "Serializable isolation violation on table" o "Relation does not exist".
Breve descrizione
Le operazioni di scrittura concorrenti in Amazon Redshift devono essere serializzabili in modo che le transazioni possano essere eseguite in successione. L'esecuzione seriale deve inoltre produrre gli stessi risultati dell'esecuzione concorrente. Per ulteriori informazioni, consulta Isolamento serializzabile.
Risoluzione
Per risolvere gli errori di isolamento serializzabile, utilizza uno dei seguenti metodi.
Riprova le transazioni annullate
Se Amazon Redshift rileva che un carico di lavoro concorrente non è serializzabile, potrebbero essere presenti lacune nella logica dell'applicazione. Riprova la transazione annullata che ha causato l'errore.
Utilizza commit intermedi
Quando viene emesso un commit o un rollback, la transazione viene completata. Se una transazione viene eseguita prima dell'esecuzione dell'operazione di eliminazione dalla tabella, viene creata una nuova transazione e viene preservato l'isolamento serializzabile.
L'esempio seguente utilizza un comando COMMIT intermedio:
DELETE FROM XXXXX WHERE date = XXXXX'; →COMMIT; BEGIN TRANSACTION; DELETE FROM XXXXX WHERE date = XXXXX';
Sposta le operazioni non atomiche all'esterno della transazione
Utilizza questo metodo quando singole operazioni all'interno di due transazioni si fanno riferimento a vicenda in un modo che potrebbe influire sul risultato dell'altra transazione.
Quando non è necessario che i risultati siano atomici con altre operazioni, sposta le istruzioni SELECT all'esterno delle transazioni.
L'esempio seguente sposta le istruzioni SELECT all'esterno delle transazioni:
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;
Le transazioni precedenti sono serializzabili. Se esegui le transazioni in sequenza, i risultati sono gli stessi che si ottengono con l’esecuzione concorrente.
Blocca tutte le tabelle in ogni sessione per forzare la serializzazione
Il comando LOCK blocca le operazioni che potrebbero causare errori di isolamento serializzabile. Quando esegui il comando LOCK, completa i seguenti passaggi:
- Blocca tutte le tabelle interessate dalla transazione, incluse le tabelle su cui influiscono le istruzioni SELECT di sola lettura all'interno della transazione.
- Blocca le tabelle nello stesso ordine, indipendentemente da quello in cui vengono eseguite le operazioni.
- Prima di eseguire operazioni, blocca tutte le tabelle all'inizio della transazione.
Utilizza l'isolamento dello snapshot per le transazioni concorrenti
L'isolamento serializzabile implementa una serializzazione rigorosa. Una transazione potrebbe non riuscire quando Amazon Redshift non è in grado di mappare il risultato su un ordine seriale delle transazioni in esecuzione concorrente.
L'isolamento dello snapshot consente una maggiore concorrenza in modo che le modifiche concorrenti a righe diverse della stessa tabella possano essere completate correttamente.
Le transazioni continuano ad avvenire sull'ultima versione salvata, o sull'ultimo snapshot salvato, del database.
L'isolamento dello snapshot viene impostato sul database includendo il parametro ISOLATION LEVEL del comando CREATE DATABASE o ALTER DATABASE.
Per visualizzare il modello di concorrenza utilizzato dal database, esegui questa query 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, utilizza le seguenti best practice:
- Per modificare il livello di isolamento del database, devi disporre dell'autorizzazione superutente o CREATE DATABASE.
- Non puoi modificare il livello di isolamento dell'ambiente del database.
- Non puoi modificare il livello di isolamento all'interno di un blocco di transazioni.
- Il comando alter isolation level ha esito negativo quando altri utenti si connettono al database.
- Il comando alter isolation level può modificare le impostazioni del livello di isolamento della sessione corrente.
Per ulteriori informazioni, consulta Come correggere errori di isolamento serializzabile.
Informazioni correlate
ERROR:1023 DETAIL: violazione di isolamento serializzabile su una tabella in Redshift
- Argomenti
- Analytics
- Lingua
- Italiano
