Por que o status da minha consulta do Amazon Redshift mudou de “Concluído” para “Anulado” quando nenhuma alteração foi feita?

4 minuto de leitura
0

O console do Amazon Redshift mostra que o status da consulta é “Concluído”, mas o status muda para “Anulado”. No entanto, nenhuma atualização foi feita na tabela quando eu consultei os resultados de uma sessão ou transação anterior.

Breve descrição

As instruções SQL que manipulam dados ou criam objetos de banco de dados não persistem até que a transação seja confirmada. Isso não se aplica às instruções TRUNCATE, que implicitamente executam um COMMIT.

O console do Amazon Redshift mostrará que o status da consulta é “Concluído” para uma instrução SQL se ela ainda estiver em uma transação aberta. O status mudará para “Anulado” se a transação for revertida. A tabela do sistema STL_QUERY também mostra que a instrução SQL é concluída com êxito quando o valor da coluna anulada é 0.

Se a transação for confirmada posteriormente, as alterações serão exibidas. No entanto, se a transação não puder ser confirmada, o console do Amazon Redshift mostrará que a consulta foi anulada. Para identificar o motivo pelo qual sua transação não pode ser confirmada, verifique as tabelas do sistema STL.

Resolução

Para confirmar se uma transação foi confirmada ou revertida, use a saída da consulta a seguir na tabela do sistema SVL_STATEMENTTEXT. Em seguida, filtre pelo ID da transação (xid) da instrução SQL:

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

A saída da consulta exibe uma instrução “Desfazendo 1 transação” para a transação revertida.

Se uma transação começar com uma instrução BEGIN, significa que a instrução foi aberta explicitamente pelo usuário ou pela aplicação. A instrução também deve ser confirmada explicitamente. As transações que não são iniciadas com uma instrução BEGIN geralmente são confirmadas automaticamente pelo cliente SQL ou pela opção AUTO COMMIT do driver. Se a opção estiver desabilitada, o usuário deverá enviar explicitamente um COMMIT.

Quando uma transação é devidamente confirmada, as alterações da transação são duradouras (persistentes) e podem ser vistas por outros XIDs que foram iniciados após a instrução COMMIT. Para obter mais informações, consulte Isolamento serializável.

Quando não há nenhuma mensagem END, COMMIT ou “Desfazendo 1 transação” exibida na tabela do sistema SVL_STATEMENTTEXT, o XID ainda pode estar aberto. Use a visualização SVV_TRANSACTIONS para identificar transações abertas e contenções de LOCK..

As tabelas de sistemas STL_COMMIT_STATS e STL_UNDONE também podem ser usadas para confirmar se uma transação terminou com um COMMIT ou um ROLLBACK.

Execute a seguinte consulta para descobrir se as alterações foram confirmadas:

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];

Execute a seguinte consulta para descobrir se as alterações foram revertidas:

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

As alterações na transação não persistem devido a um comando ROLLBACK explícito ou se ele não for executado até a conclusão. ROLLBACKS explícitas não podem ocorrer quando há uma violação de isolamento serializável. Eles também não podem ocorrer quando um administrador finaliza uma sessão com TERMINATES ou cancela uma consulta com CANCELS. Os tempos limite em uma conexão de rede também podem impedir que as alterações nas transações persistam.

Se ocorrer uma reversão, o cliente receberá uma mensagem de erro com mais detalhes. É uma prática recomendada configurar seu cliente para registrar erros. Para obter mais informações, consulte Configurar o registro em log (JDBC) ou LogLevel (ODBC).

Informações relacionadas

STL_DDLTEXT

AWS OFICIAL
AWS OFICIALAtualizada há um ano