¿Por qué el estado de mi consulta de Amazon Redshift ha cambiado de «Finalizada» a «Cancelada» si no se ha realizado ningún cambio?

4 minutos de lectura
0

La consola de Amazon Redshift muestra que el estado de la consulta es «Finalizada», pero luego cambia a «Cancelada». Sin embargo, no se ha realizado ninguna actualización en la tabla al consultar los resultados de una sesión o transacción anteriores.

Breve descripción

Las instrucciones SQL que manipulan datos o crean objetos de bases de datos no se mantienen hasta que se confirma la transacción. Esto no se aplica a las instrucciones TRUNCATE, que ejecutan la instrucción COMMIT de forma implícita.

La consola de Amazon Redshift muestra que el estado de la consulta es «Finalizada» si la instrucción SQL aún se encuentra en una transacción abierta. El estado cambia a «Cancelada» si se restaura la transacción. La tabla del sistema STL_QUERY también muestra que la instrucción SQL ha finalizado correctamente si el valor de la columna cancelada es 0.

Si la transacción se confirma posteriormente, aparecerán los cambios. Sin embargo, si la transacción no se puede confirmar, la consola de Amazon Redshift indicará que la consulta se ha cancelado. Para identificar el motivo por el que no se puede confirmar la transacción, consulte las tablas del sistema STL.

Resolución

Para comprobar si una transacción se ha confirmado o restaurado, utilice el resultado de la siguiente consulta en la tabla del sistema SVL_STATEMENTTEXT. A continuación, filtre los datos en función del ID de transacción (xid) de la instrucción SQL:

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

El resultado de la consulta muestra la instrucción «Deshaciendo 1 transacción» para la transacción restaurada.

Si una transacción comienza con una instrucción BEGIN, significa que el usuario o la aplicación la han abierto explícitamente. La instrucción también se debe confirmar explícitamente. Las transacciones que no se inician con una instrucción BEGIN suelen confirmarse automáticamente mediante el cliente SQL o la opción AUTO COMMIT del controlador. Si la opción está deshabilitada, el usuario deberá ejecutar COMMIT de forma explícita.

Si una transacción se confirma correctamente, los cambios en la transacción serán duraderos (persistentes) y se podrán ver en otros XID que se hayan iniciado después de la instrucción COMMIT. Para obtener más información, consulte Aislamiento serializable.

Si no aparece ningún mensaje END, COMMIT o «Deshaciendo 1 transacción» en la tabla del sistema SVL_STATEMENTTEXT, es posible que el XID siga abierto. Utilice la vista SVV_TRANSACTIONS para identificar las transacciones abiertas y la contención de LOCK.

Las tablas del sistema STL_COMMIT_STATS y STL_UNDONE también se pueden utilizar para confirmar si una transacción ha finalizado con COMMIT o ROLLBACK.

Ejecute la siguiente consulta para averiguar si se han confirmado los cambios:

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

Ejecute la siguiente consulta para averiguar si los cambios se han restaurado:

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

Los cambios en las transacciones no se mantienen si hay un comando ROLLBACK explícito o si la transacción no se ejecuta hasta el final. No puede haber restauraciones explícitas si se produce una infracción del aislamiento serializable. Tampoco si un administrador termina una sesión o cancela una consulta. Los tiempos de espera en una conexión de red también pueden impedir que los cambios en las transacciones se mantengan.

Si se produce una restauración, se mostrará un mensaje de error con más detalles en el cliente. Se recomienda configurar el cliente para que registre los errores. Para obtener más información, consulte Configuración del registro (JDBC) o LogLevel (ODBC).

Información relacionada

STL_DDLTEXT

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año