Passer au contenu

Comment résoudre les erreurs "Serializable isolation violation on table" ou "Relation does not exist" dans Amazon Redshift ?

Lecture de 4 minute(s)
0

Lorsque j'exécute des opérations Amazon Redshift simultanées dans différentes sessions, l’erreur "Serializable isolation violation on table" ou "Relation does not exist" s’affiche.

Brève description

Les opérations d'écriture simultanées dans Amazon Redshift doivent être sérialisables afin que les transactions puissent s'exécuter par la suite. L'exécution en série doit également produire les mêmes résultats que lorsque les transactions sont exécutées simultanément. Pour en savoir plus, consultez la section Isolation sérialisable.

Résolution

Pour résoudre les erreurs d'isolation sérialisable, appliquez l'une des méthodes suivantes.

Réessayer les transactions annulées

Si Amazon Redshift détecte qu'une charge de travail simultanée n'est pas sérialisable, la logique d'application peut présenter des lacunes. Réessayez la transaction annulée à l'origine de l'erreur.

Utiliser des validations intermédiaires

Lorsqu'une validation ou une annulation est émise, la transaction est terminée. Si une transaction est validée avant l'exécution de l'opération de suppression de la table, une nouvelle transaction est créée et l'isolation sérialisable est préservée.

L'exemple suivant utilise une commande COMMIT intermédiaire :

DELETE FROM XXXXX WHERE date = XXXXX';
→COMMIT;
BEGIN TRANSACTION;
DELETE FROM XXXXX WHERE date = XXXXX';

Déplacer les opérations non atomiques en dehors de la transaction

Utilisez cette méthode lorsque des opérations individuelles au sein de deux transactions se recoupent d'une manière susceptible d'affecter le résultat de l'autre transaction.

Lorsqu’il n’est pas nécessaire que les résultats soient atomiques avec d’autres opérations, déplacez les instructions SELECT en dehors de leurs transactions.

L'exemple suivant déplace les instructions SELECT en dehors de leurs transactions :

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;

Les transactions précédentes sont sérialisables. Si vous exécutez les transactions dans l'ordre, les résultats sont les mêmes que lorsque vous les exécutez simultanément.

Verrouiller toutes les tables de chaque session pour forcer la sérialisation

La commande LOCK bloque les opérations susceptibles de provoquer des erreurs d'isolation sérialisables. Lorsque vous exécutez la commande LOCK, procédez comme suit :

  • Verrouillez toutes les tables concernées par la transaction, y compris les tables concernées par les instructions SELECT en lecture seule contenues dans la transaction.
  • Verrouillez les tables dans le même ordre, quel que soit l'ordre dans lequel les opérations sont effectuées.
  • Avant d'effectuer des opérations, verrouillez toutes les tables au début de la transaction.

Utiliser l'isolation d’instantané pour les transactions simultanées

L'isolation sérialisable met en œuvre une sérialisation stricte. Une transaction peut échouer lorsqu'Amazon Redshift ne parvient pas à associer le résultat à un ordre sérialisé des transactions exécutées simultanément.

L'isolation d’instantané offre une plus grande simultanéité afin que les modifications simultanées apportées aux différentes lignes d'une même table puissent être effectuées correctement.

Les transactions continuent de fonctionner sur la dernière version validée, ou instantané, de la base de données.

Vous définissez l'isolation d’instantané sur la base de données et vous incluez le paramètre ISOLATION LEVEL dans la commande CREATE DATABASE ou ALTER DATABASE.

Pour afficher le modèle de simultanéité utilisé par votre base de données, exécutez la requête STV_DB_ISOLATION_LEVEL suivante :

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

Lorsque vous modifiez le niveau d'isolation d'une base de données, appliquez les bonnes pratiques suivantes :

  • Pour modifier le niveau d'isolation de la base de données, vous devez disposer de l'autorisation super-utilisateur ou CREATE DATABASE.
  • Vous ne pouvez pas modifier le niveau d'isolation de l'environnement de base de données.
  • Vous ne pouvez pas modifier le niveau d'isolation au sein d'un bloc de transactions.
  • La commande alter isolation level échoue lorsque d'autres utilisateurs se connectent à la base de données.
  • La commande alter isolation level peut modifier les paramètres du niveau d'isolation de la session en cours.

Pour plus d'informations, consultez la section Comment corriger les erreurs d'isolation sérialisables.

Informations connexes

ERREUR :1023 DÉTAIL : Violation d'isolement sérialisable sur une table dans Redshift

ERREUR :1018 DÉTAIL : La relation n'existe pas

Gestion des opérations d'écriture simultanées

AWS OFFICIELA mis à jour il y a 8 mois