Comment résoudre l'erreur « ERROR: 1023 DETAIL: Serializable isolation violation on table in Redshift » (Violation d'isolement sérialisable sur une table dans Redshift) ?

Date de la dernière mise à jour : 18/02/2022

Si j'exécute des opérations simultanées Amazon Redshift dans différentes séances, le message suivant s'affiche : « ERROR: 1023 DETAIL: Serializable isolation violation on table in Redshift » (Violation d'isolement sérialisable sur une table dans Redshift). Comment puis-je résoudre cette erreur ?

Brève description

Les opérations d'écriture simultanées dans Amazon Redshift doivent être sérialisables. Cela signifie que les transactions doivent pouvoir être exécutées en série dans au moins une commande qui produit les mêmes résultats que si les transactions étaient exécutées simultanément. Pour plus d'informations, consultez la section Isolement sérialisable.

Utilisez l'une des méthodes suivantes (ou les deux) pour résoudre les erreurs d'isolement sérialisable :

  • Déplacer les opérations qui ne doivent pas nécessairement se trouver dans la même transaction pour une atomicité en dehors de la transaction
  • Forcer la sérialisation en bloquant toutes les tables dans chaque session

Résolution

Déplacer les opérations qui ne doivent pas nécessairement se trouver dans la même transaction pour une atomicité en dehors de la transaction

Utilisez cette méthode lorsque des opérations individuelles au sein de deux transactions effectuent des renvois entre elles, ce qui peut affecter le résultat de l'une des transactions. Par exemple, supposons que deux séances démarrent chacune une transaction :

Session1_Redshift = # BEGIN;
Session2_Redshift = # BEGIN;

Le résultat de l'instruction SELECT dans une transaction peut être affecté par l'instruction INSERT dans l'autre. Si elles sont exécutées en série, et ce, dans n'importe quel ordre, le résultat d'une instruction SELECT renvoie toujours une ligne de plus que si les transactions étaient exécutaient simultanément. Étant donné qu'aucun ordre dans lequel les opérations peuvent être exécutées en série ne peut produire le même résultat que lorsqu'elles sont exécutées simultanément, la dernière opération qui est exécutée entraîne une erreur d'isolement sérialisable :

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 le résultat des instructions SELECT n'est pas important (c'est-à-dire que l'atomicité des opérations dans les transactions n'est pas importante), déplacez les instructions SELECT en dehors de leurs transactions. Par exemple :

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;

Dans ces exemples, il n'y a pas de références croisées dans les transactions. Les deux instructions INSERT n'ont aucune influence l'une sur l'autre. Étant donné qu'il existe au moins un ordre dans lequel les transactions peuvent être exécutées en série et produire le même résultat que si elles étaient exécutées simultanément, les transactions sont sérialisables.

Forcer la sérialisation en bloquant toutes les tables dans chaque séance

La commande LOCK bloque les opérations entraînant des erreurs d'isolement sérialisable. Lorsque vous utilisez la commande LOCK, veillez à effectuer les tâches suivantes :

  • Verrouillez toutes les tables affectées par la transaction, y compris celles affectées par des instructions SELECT en lecture seule au sein de la transaction.
  • Verrouillez les tables dans le même ordre, quel que soit l'ordre dans lequel les opérations sont effectuées.
  • Verrouillez toutes les tables au début de la transaction, avant d'exécuter toute opération.

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?