Perché lo stato della mia query su Amazon Redshift è cambiato da "Completato" a "Interrotto" quando non sono state apportate modifiche?

3 minuti di lettura
0

Nella console Amazon Redshift viene indicato che lo stato della query è "Completato", ma lo stato cambia successivamente in "Interrotto". Tuttavia, non sono stati apportati aggiornamenti alla tabella quando ho interrogato i risultati di una sessione o transazione precedente.

Breve descrizione

Le istruzioni SQL che manipolano i dati o creano oggetti di database non vengono mantenute finché la transazione non viene confermata. Questo non si applica alle istruzioni TRUNCATE, che eseguono implicitamente un COMMIT.

La console Amazon Redshift mostra che lo stato della query è "Completato" per un'istruzione SQL se è ancora in una transazione aperta. Lo stato cambia in "Interrotto" se la transazione viene annullata. La tabella di sistema STL_QUERY mostra anche che l'istruzione SQL viene completata correttamente quando il valore della colonna interrotta è 0.

Se la transazione viene successivamente confermata, verranno visualizzate le modifiche. Tuttavia, se la transazione non può essere confermata, la console Amazon Redshift mostra che la query è stata interrotta. Per identificare il motivo per cui la transazione non può essere confermata, controlla le tabelle del sistema STL.

Risoluzione

Per verificare se una transazione è stata confermata o ripristinata, utilizza l'output della seguente query nella tabella di sistema SVL_STATEMENTTEXT. Quindi, filtra in base all'ID della transazione (xid) dell'istruzione SQL:

SELECT *
FROM SVL_STATEMENTTEXT
WHERE xid IN (SELECT xid FROM STL_QUERY WHERE query = [Query ID]) ORDER BY starttime, sequence;

L'output della query visualizza un’istruzione "Annullamento di 1 transazione" per la transazione annullata.

Se una transazione inizia con un'istruzione BEGIN, l'istruzione è stata aperta in modo esplicito dall'utente o dall'applicazione. L’istruzione deve inoltre essere esplicitamente confermata. Le transazioni che non vengono avviate con un'istruzione BEGIN vengono generalmente confermate automaticamente dall'opzione AUTO COMMIT del client SQL o del driver. Se l'opzione è disabilitata, l'utente deve inviare esplicitamente un COMMIT.

Quando una transazione viene confermata correttamente, le modifiche della transazione sono durevoli (persistenti) e possono essere visualizzate da altri XID che sono stati avviati dopo l'istruzione COMMIT. Per ulteriori informazioni, consulta Isolamento serializzabile.

Quando non viene visualizzato alcun messaggio END, COMMIT o "Annullamento di 1 transazione" nella tabella di sistema SVL_STATEMENTTEXT, l'XID potrebbe essere ancora aperto. Usa la visualizzazione SVV_TRANSACTIONS per identificare le transazioni aperte e le contese LOCK.

Le tabelle di sistema STL_COMMIT_STRATS e STL_UNDONE possono essere utilizzate anche per confermare se una transazione è terminata con un COMMIT o un ROLLBACK.

Esegui la seguente query per scoprire se le modifiche sono state confermate:

SELECT q.query, q.xid, NVL2 (cs.endtime, cs.endtime::text, 'NO COMMIT') AS commit_endtime
FROM STL_QUERY q LEFT JOIN STL_COMMIT_STATS cs ON q.xid = cs.xid AND cs.node = -1
WHERE q.query = [QUERY ID];

Esegui la seguente query per scoprire se le modifiche sono state annullate:

SELECT *
FROM STL_UNDONE
WHERE xact_id_undone IN (SELECT xid from STL_QUERY where query = [QUERY ID]);

Le modifiche alla transazione non vengono mantenute a causa di un comando ROLLBACK esplicito o se non viene eseguito fino al completamento. I ROLLBACK espliciti non possono verificarsi in caso di violazione dell'isolamento serializzabile. Inoltre, non possono verificarsi quando un amministratore TERMINA una sessione o ANNULLA una query. I timeout in una connessione di rete possono anche impedire la persistenza delle modifiche alle transazioni.

Se si verifica un rollback, il client riceve un messaggio di errore con ulteriori dettagli. È consigliabile configurare il client per registrare gli errori. Per ulteriori informazioni, consulta Configura la registrazione(JDBC) o LogLevel (ODBC).

Informazioni correlate

STL_DDLTEXT

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa