View a markdown version of this page

DDL y las transacciones distribuidas en Aurora DSQL - Amazon Aurora DSQL

DDL y las transacciones distribuidas en Aurora DSQL

En Aurora DSQL, el comportamiento del lenguaje de definición de datos (DDL) es distinto al de PostgreSQL. Aurora DSQL presenta una capa de base de datos distribuida y compartida Multi-AZ basada en flotas de computación y almacenamiento de varios inquilinos. Dado que no existe un único nodo principal o líder de base de datos, el catálogo de base de datos está distribuido. Por tanto, Aurora DSQL administra los cambios de esquema DDL como transacciones distribuidas.

En concreto, el comportamiento de DDL en Aurora DSQL es distinto según se indica a continuación:

Respuestas de control de simultaneidad

Como el catálogo de base de datos se distribuye, Aurora DSQL administra los cambios de esquema DDL como transacciones distribuidas que actualizan la versión del catálogo. Las sesiones que tienen una copia en caché del catálogo en una versión anterior pueden recibir una respuesta de control de simultaneidad con el código SQLSTATE 40001 y el código OCC OC001 la próxima vez que interactúen con el almacenamiento.

Por ejemplo, considere la siguiente secuencia de acciones:

  1. En la sesión 1, un usuario agrega una columna a la tabla mytable. Esto actualiza la versión del catálogo.

  2. En la sesión 2, un usuario intenta insertar una fila en mytable. En esta sesión todavía se guarda en caché la versión anterior del catálogo.

    Aurora SQL devuelve SQL Error [40001]: ERROR: schema has been updated by another transaction (OC001).

nota

También se puede producir una respuesta OC001 cuando el cambio de esquema ya se ha completado antes de que comience la transacción afectada. Los procesadores de consultas de Aurora DSQL detectan los cambios de catálogo de forma reactiva durante la ejecución de la consulta, por lo que una sesión que ha estado inactiva podría seguir funcionando con una versión de catálogo obsoleta. Al volver a intentarlo, la sesión actualiza la caché del catálogo y, por lo general, la transacción se realiza correctamente.

DDL y DML en la misma transacción

Las transacciones en Aurora DSQL pueden contener solo una instrucción DDL y no pueden tener tanto instrucciones DDL como DML. Esta restricción significa que no se puede crear una tabla e insertar datos en la misma tabla dentro de la misma transacción. Por ejemplo, Aurora DSQL admite las siguientes transacciones secuenciales.

BEGIN; CREATE TABLE mytable (ID_col integer); COMMIT; BEGIN; INSERT into FOO VALUES (1); COMMIT;

Aurora DSQL no admite la siguiente transacción, que incluye instrucciones CREATE e INSERT.

BEGIN; CREATE TABLE FOO (ID_col integer); INSERT into FOO VALUES (1); COMMIT;
DDL asíncrono

En PostgreSQL estándar, operaciones DDL como CREATE INDEX bloquean la tabla afectada, por lo que no está disponible para lecturas y escrituras desde otras sesiones. En Aurora DSQL, estas instrucciones DDL se ejecutan de forma asíncrona mediante un administrador en segundo plano. El acceso a la tabla afectada no se bloquea. De este modo, las sentencias DDL en tablas de gran tamaño pueden ejecutarse sin tiempo de inactividad ni impacto en el rendimiento. Para obtener más información sobre el administrador de trabajos asíncronos en Aurora DSQL, consulte Índices asíncronos en Aurora DSQL.