Cuando ejecuto operaciones simultáneas de Amazon Redshift en diferentes sesiones, se produce un error "Serializable isolation violation on table" o "Relation does not exist".
Descripción corta
Las operaciones de escritura simultánea en Amazon Redshift deben poder serializarse para que las transacciones puedan ejecutarse posteriormente. La ejecución en serie también debe producir los mismos resultados que cuando las transacciones se ejecutan simultáneamente. Para obtener más información, consulta Aislamiento serializable.
Resolución
Para resolver los errores de aislamiento serializable, utiliza uno de los métodos siguientes.
Reintentar las transacciones canceladas
Si Amazon Redshift detecta que una carga de trabajo simultánea no es serializable, es posible que haya lagunas en la lógica de la aplicación. Vuelve a intentar la transacción cancelada que provocó el error.
Uso de confirmaciones intermedias
Cuando se emite una confirmación o una restauración, la transacción se completa. Si una transacción se confirma antes de que se ejecute la operación de eliminación de la tabla, se crea una nueva transacción y se conserva el aislamiento serializable.
El siguiente ejemplo utiliza un comando COMMIT intermedio:
DELETE FROM XXXXX WHERE date = XXXXX';
→COMMIT;
BEGIN TRANSACTION;
DELETE FROM XXXXX WHERE date = XXXXX';
Mover las operaciones no atómicas fuera de la transacción
Utiliza este método si hay referencias cruzadas entre operaciones individuales dentro de dos transacciones que podrían afectar al resultado de la otra transacción.
Cuando los resultados no tengan que ser atómicos con otras operaciones, mueve las instrucciones SELECT fuera de sus transacciones.
En el siguiente ejemplo se mueven las instrucciones SELECT fuera de sus transacciones:
Session1_Redshift=# BEGIN;Session1_Redshift = # insert into tab1 values (1)Session1_Redshift = # END;
Session1_Redshift # select * from tab2;
Session2_Redshift # select * from tab1;Session2_Redshift =# BEGIN;
Session2_Redshift = # insert into tab2 values (1)
Session2_Redshift = # END;
Las transacciones anteriores son serializables. Si ejecutas las transacciones en secuencia, los resultados serán los mismos que cuando las ejecutaste simultáneamente.
Bloqueo de todas las tablas de cada sesión para forzar la serialización
El comando LOCK bloquea las operaciones que podrían provocar errores de aislamiento serializable. Cuando ejecutes el comando LOCK, completa los pasos siguientes:
- Bloquea todas las tablas a las que afecta la transacción e incluye las tablas a las que afectan las instrucciones SELECT de solo lectura contenidas en la transacción.
- Bloquea las tablas en el mismo orden, independientemente del orden en que se realicen las operaciones.
- Antes de realizar las operaciones, bloquea todas las tablas al principio de la transacción.
Uso del aislamiento de instantáneas para transacciones simultáneas
El aislamiento serializable implementa una serialización estricta. Una transacción puede fallar si Amazon Redshift no puede asignar el resultado a un orden en serie de las transacciones que se están ejecutando simultáneamente.
El aislamiento de instantáneas permite una mayor simultaneidad, de modo que las modificaciones simultáneas en diferentes filas de la misma tabla se pueden completar correctamente.
Las transacciones siguen funcionando en la última versión confirmada, o en una instantánea, de la base de datos.
Debes definir el aislamiento de instantáneas en la base de datos con el parámetro ISOLATION LEVEL en los comandos CREATE DATABASE o ALTER DATABASE.
Para ver el modelo de simultaneidad que utiliza tu base de datos, ejecuta la siguiente consulta STV_DB_ISOLATION_LEVEL:
SELECT * FROM stv_db_isolation_level;
The database can then be altered to SNAPSHOT ISOLATION:
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
Cuando modifiques el nivel de aislamiento de una base de datos, utiliza las siguientes prácticas recomendadas:
- Para cambiar el nivel de aislamiento de la base de datos, debes tener el permiso de superusuario o CREATE DATABASE.
- No puedes modificar el nivel de aislamiento del entorno de base de datos.
- No puedes modificar el nivel de aislamiento dentro de un bloque de transacciones.
- El comando para cambiar el nivel de aislamiento da error cuando otros usuarios se conectan a la base de datos.
- El comando para cambiar el nivel de aislamiento puede modificar la configuración del nivel de aislamiento de la sesión actual.
Para obtener más información, consulta Cómo corregir errores de aislamiento serializable.
Información relacionada
ERROR:1023 DETAIL: infracción del aislamiento serializable en una tabla de Redshift
ERROR:1018 DETAIL: la relación no existe
Administración de operaciones de escritura simultáneas