Lorsque j'exécute des opérations simultanées Amazon Redshift dans différentes sessions, 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 résoudre cette erreur ?

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 produirait 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

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

Cela s'applique 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 sessions 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);
Session1_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, comme illustré dans les exemples suivants :

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 session

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.

Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support.

Date de publication : 03/03/2017

Date de mise à jour : 21/03/2019