¿Cómo puedo solucionar «ERROR: 1023 DETALLES: Infracción del aislamiento serializable en la tabla de Redshift»?

5 minutos de lectura
0

Si ejecuto operaciones simultáneas de Amazon Redshift en diferentes sesiones, aparece el mensaje «ERROR: 1023 DETALLES: Infracción del aislamiento serializable en la tabla de Redshift». ¿Cómo puedo solucionar este error?

Descripción corta

Las operaciones de escritura simultáneas en Amazon Redshift deben ser serializables. Esto significa que las transacciones deben poder ejecutarse en serie en al menos un orden que produzca los mismos resultados que si las transacciones se ejecutaran simultáneamente. Para obtener más información, consulte Aislamiento serializable.

Utilice uno o todos los métodos siguientes para solucionar los errores relacionados con el aislamiento serializable:

  • Movimiento de las operaciones que no tengan que estar en la misma transacción por motivos de atomicidad para que queden fuera de la transacción
  • Serialización forzada mediante el bloqueo de todas las tablas en cada sesión
  • Uso del aislamiento de instantánea para transacciones simultáneas

Resolución

Movimiento de las operaciones que no tengan que estar en la misma transacción por motivos de atomicidad para que queden fuera de la transacción

Utilice 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. Por ejemplo, supongamos que dos sesiones inician una transacción:

Session1_Redshift = # BEGIN;
Session2_Redshift = # BEGIN;

El resultado de la instrucción SELECT de cada transacción puede verse afectado por la instrucción INSERT de la otra. Si las transacciones se ejecutan en serie, sea cual sea el orden, el resultado de una instrucción SELECT siempre devolverá una fila más que si las transacciones se ejecutasen simultáneamente. Como no hay ningún orden en el que las operaciones se puedan ejecutar en serie que pueda producir el mismo resultado que cuando se ejecutan simultáneamente, la última operación que se ejecuta produce un error de aislamiento serializable:

Session1_redshift=# select * from tab1;
Session1_redshift =# insert into tab2 values (1);
Session2_redshift =# insert into tab1 values (1);
Session2_redshift =# select * from tab2;

Si el resultado de las instrucciones SELECT no es importante (es decir, la atomicidad de las operaciones de las transacciones no es importante), mueva las instrucciones SELECT para que queden fuera de sus transacciones. Por ejemplo:

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;

En estos ejemplos, no hay referencias cruzadas en las transacciones. Las dos instrucciones INSERT no se afectan entre sí. Como hay al menos un orden en el que las transacciones se pueden ejecutar en serie y producir el mismo resultado que si se ejecutaran simultáneamente, las transacciones se pueden serializar.

Serialización forzada mediante el bloqueo de todas las tablas en cada sesión

El comando LOCK bloquea las operaciones que podrían provocar errores de aislamiento serializable. Si utiliza el comando LOCK, asegúrese de hacer lo siguiente:

  • Bloquee todas las tablas afectadas por la transacción, incluidas las afectadas por las instrucciones SELECT de solo lectura dentro de la transacción.
  • Bloquee las tablas en el mismo orden, independientemente del orden en que se realicen las operaciones.
  • Bloquee todas las tablas al principio de la transacción antes de realizar cualquier operación.

Uso del aislamiento de instantánea para transacciones simultáneas

La opción SERIALIZABLE implementa una serialización estricta, en la que una transacción puede dar error si el resultado no se puede asignar a un orden de serie para las transacciones que se ejecutan simultáneamente.

La opción SNAPSHOT ISOLATION 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.

El aislamiento de instantánea se define 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 su base de datos, ejecute la siguiente consulta STV_DB_ISOLATION_LEVEL de ejemplo:

SELECT * FROM stv_db_isolation_level;
The database can then be altered to SNAPSHOT ISOLATION:
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;

Tenga en cuenta lo siguiente al modificar el nivel de aislamiento de una base de datos:

  • Debe tener privilegios de superusuario o CREATE DATABASE para la base de datos actual para poder cambiar el nivel de aislamiento de la base de datos.
  • No puede modificar el nivel de aislamiento del entorno de base de datos DEV.
  • No puede modificar el nivel de aislamiento dentro de un bloque de transacciones.
  • El comando para cambiar el nivel de aislamiento da error si hay otros usuarios conectados 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.

Información relacionada

Administración de operaciones de escritura simultáneas

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años