Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ GaussDB(DWS)/ Preguntas frecuentes/ Uso de la base de datos/ ¿En qué escenarios estaría una declaración "idle in transaction"?
Actualización más reciente 2023-10-12 GMT+08:00

¿En qué escenarios estaría una declaración "idle in transaction"?

Cuando se consulta información de SQL de usuario en la vista PGXC_STAT_ACTIVITY, la columna state del resultado de la consulta a veces muestra idle in transaction. idle in transaction indica que el backend está en una transacción, pero no se está ejecutando ninguna instrucción. Este estado indica que se ha ejecutado una instrucción. Por lo tanto, el valor de query_id es 0, pero la transacción no se ha confirmado ni se ha revertido. Las sentencias en este estado se han ejecutado y no ocupan recursos de CPU y E/S, pero ocupan recursos de conexión tales como conexiones y conexiones simultáneas.

Si una declaración se encuentra en el estado idle in transaction, rectificar el fallo haciendo referencia a los siguientes escenarios y soluciones comunes:

Escenario 1: Se ha iniciado una transacción pero no se ha cometido, y la declaración se encuentra en el estado "inactivo en la transacción"

BEGIN/START TRANSACTION se ejecuta manualmente para iniciar una transacción. Después de ejecutar las sentencias, no se ejecuta COMMIT/ROLLBACK. Ver el PGXC_STAT_ACTIVITY:

1
SELECT state, query, query_id FROM pgxc_stat_activity;

El resultado muestra que la instrucción está en el estado idle in transaction.

Solution: Ejecute manualmente COMMIT/ROLLBACK en la transacción iniciada.

Escenario 2: Después de ejecutar una sentencia de DDL en un procedimiento almacenado, otros nodos del procedimiento almacenado están en el estado "inactivo en transacción"

Crear un procedimiento almacenado:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
CREATE OR REPLACE FUNCTION public.test_sleep()
RETURNS void
LANGUAGE plpgsql
AS $$

BEGIN
    truncate t1;
    truncate t2;
    EXECUTE IMMEDIATE 'select pg_sleep(6)';
	RETURN;
END$$;
Ver la vista PGXC_STAT_ACTIVITY:
1
SELECT coorname,pid,query_id,state,query,usename FROM pgxc_stat_activity WHERE usename='jack';

El resultado muestra que truncate t2 está en el estado idle in transaction y coorname es coordinator2. Esto indica que la instrucción se ha ejecutado en cn2 y que el procedimiento almacenado está ejecutando la siguiente instrucción.

Solution: Este problema es causado por la ejecución lenta del procedimiento almacenado. Espere hasta que se complete la ejecución del procedimiento almacenado. También puede optimizar las instrucciones que se ejecutan lentamente en el procedimiento almacenado.

Escenario 3: Un gran número de declaraciones SAVEPOINT/RELEASE están en el estado "inactivo en la transacción" (Versiones del grupo anteriores a 8.1.0)

Ver la vista PGXC_STAT_ACTIVITY:

1
SELECT coorname,pid,query_id,state,query,usename FROM pgxc_stat_activity WHERE usename='jack';

El resultado muestra que la instrucción SAVEPOINT/RELEASE está en el estado idle in transaction.

Solución:

Las declaraciones SAVEPOINT y RELEASE son generadas automáticamente por el sistema cuando se ejecuta un procedimiento almacenado con EXCEPTION. En las versiones posteriores a 8.1.0, SAVEPOINT no se entrega a los CN. Los procedimientos almacenados en GaussDB(DWS) con EXCEPTION se implementan según subtransacciones, el mapeo es como sigue:

1
2
3
4
5
6
7
8
begin
    (Savepoint s1)
    DDL/DML
exception
    (Rollback to s1)
    (Release s1)
...
end

Si hay EXCEPTION en un procedimiento almacenado cuando se inicia, se iniciará una subtransacción. Si hay una excepción durante la ejecución, la transacción actual se revierte y se gestiona la excepción; si no hay excepción, se confirma la subtransacción.

Este problema puede ocurrir cuando hay muchos procedimientos almacenados y los procedimientos almacenados están anidados. Similar al escenario 2, solo tiene que esperar después de que se ejecute todo el procedimiento almacenado. Si hay un gran número de mensajes de RELEAS, el procedimiento almacenado desencadena varias excepciones. En este caso, debe analizar si la lógica del procedimiento almacenado es adecuada.