Lorsque j'exécute des opérations Amazon Redshift simultanées dans différentes sessions, le message d’erreur « ERROR: 1023 DETAIL: Serializable isolation violation on table in Redshift » (ERREUR : 1023 DÉTAIL : Violation de l'isolation sérialisable sur la table dans Redshift) 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 les unes après les autres dans un certain ordre. 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.
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 superutilisateur ou CREATE DATABASE.
- Vous ne pouvez pas modifier le niveau d'isolation de l'environnement de base de données DEV.
- 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.
Informations connexes
Gestion des opérations d'écriture simultanées