SET TRANSACTION — establece las características de la transacción actual
SET TRANSACTIONtransaction_mode[, ...] SET TRANSACTION SNAPSHOTsnapshot_idSET SESSION CHARACTERISTICS AS TRANSACTIONtransaction_mode[, ...] dondetransaction_modees uno de: ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY [ NOT ] DEFERRABLE
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 COMMITTEDUna sentencia solo puede ver las filas confirmadas («committed») antes de que comenzara. Este es el valor por defecto.
REPEATABLE READTodas 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.
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.
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';
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.