SET TRANSACTION

SET TRANSACTION — establece las características de la transacción actual

Synopsis

SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]

donde transaction_mode es uno de:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
    [ NOT ] DEFERRABLE

Descripción

El comando SET TRANSACTION establece las características de la transacción actual. No tiene ningún efecto en las transacciones posteriores. SET SESSION CHARACTERISTICS establece las características de transacción por defecto para las transacciones posteriores de una sesión. Estos valores por defecto pueden ser anulados por SET TRANSACTION para una transacción individual.

Las características de transacción disponibles son el nivel de aislamiento de la transacción, el modo de acceso de la transacción (lectura/escritura o solo lectura), y el modo postergable («deferrable»). Además, se puede seleccionar una instantánea («snapshot»), aunque solo para la transacción actual, no como un valor predeterminado de la sesión.

El nivel de aislamiento de una transacción determina qué datos puede ver la transacción cuando otras transacciones se están ejecutando de forma concurrente:

READ COMMITTED

Una sentencia solo puede ver las filas confirmadas («committed») antes de que comenzara. Este es el valor por defecto.

REPEATABLE READ

Todas las sentencias de la transacción actual solo pueden ver las filas confirmadas antes de que se ejecutara la primera consulta o sentencia de modificación de datos en esta transacción.

SERIALIZABLE

Todas las sentencias de la transacción actual solo pueden ver las filas confirmadas antes de que se ejecutara la primera consulta o sentencia de modificación de datos en esta transacción. Si un patrón de lecturas y escrituras entre transacciones serializables concurrentes creara una situación que no podría haber ocurrido para ninguna ejecución serial (una a la vez) de esas transacciones, una de ellas se revertirá con un error de serialization_failure.

El estándar SQL define un nivel adicional, READ UNCOMMITTED. En PostgreSQL, READ UNCOMMITTED se trata como READ COMMITTED.

El nivel de aislamiento de la transacción no se puede cambiar después de que se haya ejecutado la primera consulta o sentencia de modificación de datos (SELECT, INSERT, DELETE, UPDATE, MERGE, FETCH o COPY) de una transacción. Consulta la Chapter 13 para obtener más información sobre el aislamiento de transacciones y el control de concurrencia.

El modo de acceso de la transacción determina si la transacción es de lectura/escritura o de solo lectura. Lectura/escritura es el valor por defecto. Cuando una transacción es de solo lectura, no se permiten los siguientes comandos SQL: INSERT, UPDATE, DELETE, MERGE y COPY FROM si la tabla en la que escribirían no es una tabla temporal; todos los comandos CREATE, ALTER y DROP; COMMENT, GRANT, REVOKE, TRUNCATE; y EXPLAIN ANALYZE y EXECUTE si el comando que ejecutarían está entre los listados. Esta es una noción de alto nivel de solo lectura que no impide todas las escrituras en disco.

La propiedad de transacción DEFERRABLE no tiene efecto a menos que la transacción sea también SERIALIZABLE y READ ONLY. Cuando se seleccionan estas tres propiedades para una transacción, la transacción puede bloquearse al adquirir por primera vez su instantánea, después de lo cual es capaz de ejecutarse sin la sobrecarga normal de una transacción SERIALIZABLE y sin ningún riesgo de contribuir a una falla de serialización o ser cancelada por ella. Este modo es muy adecuado para informes o respaldos de larga duración.

El comando SET TRANSACTION SNAPSHOT permite que una nueva transacción se ejecute con la misma instantánea («snapshot») que una transacción existente. La transacción preexistente debe haber exportado su instantánea con la función pg_export_snapshot (consulta la Section 9.28.5). Esa función devuelve un identificador de instantánea, que se debe proporcionar a SET TRANSACTION SNAPSHOT para especificar qué instantánea se va a importar. El identificador se debe escribir como un literal de cadena en este comando, por ejemplo '00000003-0000001B-1'. SET TRANSACTION SNAPSHOT solo se puede ejecutar al inicio de una transacción, antes de la primera consulta o sentencia de modificación de datos (SELECT, INSERT, DELETE, UPDATE, MERGE, FETCH o COPY) de la transacción. Además, la transacción ya debe estar configurada en el nivel de aislamiento SERIALIZABLE o REPEATABLE READ (de lo contrario, la instantánea se descartaría inmediatamente, ya que el modo READ COMMITTED toma una nueva instantánea para cada comando). Si la transacción importadora utiliza el nivel de aislamiento SERIALIZABLE, entonces la transacción que exportó la instantánea también debe utilizar ese nivel de aislamiento. Además, una transacción serializable que no sea de solo lectura no puede importar una instantánea de una transacción de solo lectura.

Notas

Si se ejecuta SET TRANSACTION sin un START TRANSACTION o BEGIN previo, emite una advertencia y de lo contrario no tiene efecto.

Es posible prescindir de SET TRANSACTION especificando en su lugar los modos de transacción deseados en BEGIN o START TRANSACTION. Pero esa opción no está disponible para SET TRANSACTION SNAPSHOT.

Los modos de transacción por defecto de la sesión también se pueden configurar o examinar a través de los parámetros de configuración default_transaction_isolation, default_transaction_read_only y default_transaction_deferrable. (De hecho, SET SESSION CHARACTERISTICS es solo un equivalente detallado para configurar estas variables con SET). Esto significa que los valores por defecto se pueden configurar en el archivo de configuración, mediante ALTER DATABASE, etc. Consulta la Chapter 19 para obtener más información.

Los modos de la transacción actual se pueden configurar o examinar de manera similar a través de los parámetros de configuración transaction_isolation, transaction_read_only y transaction_deferrable. La configuración de uno de estos parámetros actúa igual que la opción SET TRANSACTION correspondiente, con las mismas restricciones sobre cuándo se puede hacer. Sin embargo, estos parámetros no se pueden configurar en el archivo de configuración, ni desde ninguna otra fuente que no sea SQL en vivo.

Ejemplos

Para comenzar una nueva transacción con la misma instantánea que una transacción ya existente, primero exporta la instantánea de la transacción existente. Eso devolverá el identificador de la instantánea, por ejemplo:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
 pg_export_snapshot
---------------------
 00000003-0000001B-1
(1 row)

Luego, proporciona el identificador de la instantánea en un comando SET TRANSACTION SNAPSHOT al comienzo de la transacción recién abierta:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT '00000003-0000001B-1';

Compatibilidad

Estos comandos están definidos en el estándar SQL, excepto por el modo de transacción DEFERRABLE y la forma SET TRANSACTION SNAPSHOT, que son extensiones de PostgreSQL.

SERIALIZABLE es el nivel de aislamiento de transacción predeterminado en el estándar. En PostgreSQL, el valor predeterminado es ordinariamente READ COMMITTED, pero puedes cambiarlo como se mencionó anteriormente.

En el estándar SQL, hay otra característica de transacción que se puede configurar con estos comandos: el tamaño del área de diagnóstico. Este concepto es específico del SQL embebido y, por lo tanto, no está implementado en el servidor de PostgreSQL.

El estándar SQL requiere comas entre los modos de transacción (transaction_modes) sucesivos, pero por razones históricas PostgreSQL permite omitir las comas.