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

Sinopsis

SETTRANSACTION transaction_mode [,...]SETTRANSACTIONSNAPSHOT snapshot_id
SETSESSION CHARACTERISTICS ASTRANSACTION transaction_mode [,...]where transaction_mode is one of:

    ISOLATIONLEVEL READCOMMITTED
    READWRITE|READ ONLY
    [NOT] DEFERRABLE

Descripción

los SET TRANSACTION El comando establece las características de la transacción actual. No tiene ningún efecto sobre las transacciones posteriores. SET SESSION CHARACTERISTICS establece las características de transacción predeterminadas para las transacciones posteriores de una sesión. Estos valores predeterminados se pueden anular mediante 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 a la transacción (lectura / escritura o solo lectura) y el modo diferible. Además, se puede seleccionar una instantánea, aunque solo para la transacción actual, no como una sesión predeterminada.

El nivel de aislamiento de una transacción determina qué datos puede ver la transacción cuando otras transacciones se ejecutan al mismo tiempo:

READ COMMITTED

Una declaración solo puede ver las filas confirmadas antes de comenzar. Este es el predeterminado.

REPEATABLE READ

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

SERIALIZABLE

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

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

El nivel de aislamiento de la transacción no se puede cambiar después de la primera consulta o declaración de modificación de datos (SELECT, INSERT, DELETE, UPDATE, FETCH, o COPY) de una transacción se ha ejecutado. Ver Capítulo 13 para obtener más información sobre el aislamiento de transacciones y el control de simultaneidad.

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

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

los SET TRANSACTION SNAPSHOT El comando permite que se ejecute una nueva transacción con el mismo instantánea como una transacción existente. La transacción preexistente debe haber exportado su instantánea con el pg_export_snapshot función (consulte la Sección 9.27.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 debe escribirse como string literal en este comando, por ejemplo '000003A1-1'. SET TRANSACTION SNAPSHOT solo se puede ejecutar al inicio de una transacción, antes de la primera consulta o declaración de modificación de datos (SELECT, INSERT, DELETE, UPDATE, FETCH, o COPY) de la transacción. Además, la transacción ya debe estar configurada en SERIALIZABLE o REPEATABLE READ nivel de aislamiento (de lo contrario, la instantánea se descartaría inmediatamente, ya que READ COMMITTED mode toma una nueva instantánea para cada comando). Si la transacción de importación utiliza SERIALIZABLE nivel de aislamiento, 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 SET TRANSACTION se ejecuta sin previo START TRANSACTION o BEGIN, emite una advertencia y, de lo contrario, no tiene ningún efecto.

Es posible prescindir de SET TRANSACTION en lugar de especificar el deseado transaction_modes en BEGIN o START TRANSACTION. Pero esa opción no está disponible para SET TRANSACTION SNAPSHOT.

Los modos de transacción predeterminados de la sesión también se pueden establecer estableciendo 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 predeterminados se pueden establecer en el archivo de configuración, a través de ALTER DATABASE, etc. Consultar Capítulo 19 para más información.

Ejemplos de

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

BEGINTRANSACTIONISOLATIONLEVELREPEATABLEREAD;SELECT pg_export_snapshot();
 pg_export_snapshot
---------------------00000003-0000001B-1(1row)

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

BEGINTRANSACTIONISOLATIONLEVELREPEATABLEREAD;SETTRANSACTIONSNAPSHOT'00000003-0000001B-1';

Compatibilidad

Estos comandos se definen en el estándar SQL, excepto para el DEFERRABLE modo de transacción y el SET TRANSACTION SNAPSHOT formulario, que son extensiones de PostgreSQL.

SERIALIZABLE es el nivel de aislamiento de transacciones predeterminado en el estándar. En PostgreSQL, el valor predeterminado es normalmente READ COMMITTED, pero puede 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 de SQL incorporado y, por lo tanto, no se implementa en el servidor PostgreSQL.

El estándar SQL requiere comas entre sucesivas transaction_modes, pero por razones históricas, PostgreSQL permite omitir las comas.

Anterior Hasta próximo
CONFIGURAR LA AUTORIZACIÓN DE LA SESIÓN Hogar SHOW