PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 16.5 » Langage SQL » Contrôle d'accès simultané » Gestion des échecs de sérialisation

13.5. Gestion des échecs de sérialisation #

Les niveaux d'isolation Repeatable Read et Serializable peuvent produire des erreurs conçues pour empêcher des anomalies de sérialisation. Comme indiqué précédemment, les applications utilisant ces niveaux doivent être préparées pour tenter de nouveau les transactions qui échouent suite à des erreurs de sérialisation. Ce type de message d'erreur variera suivant les circonstances précises, mais il y aura toujours le code SQLSTATE 40001 (serialization_failure).

Il pourrait aussi être conseillé de reprendre les échecs de deadlock. Ils ont le code SQLSTATE 40P01 (deadlock_detected).

Dans certains cas, il est aussi approprié de tenter de nouveau après des échecs d'unicité, qui ont le code SQLSTATE 23505 (unique_violation), et des échecs de contrainte d'exclusion qui ont le code SQLSTATE 23P01 (exclusion_violation). Par exemple, si l'application sélectionne une nouvelle valeur pour une clé primaire après l'inspection les clés stockées enregistrées, elle pourrait obtenir un échec d'unicité parce qu'une autre application a sélectionné la même nouvelle clé en même temps. Ceci est en réalité un échec de sérialisation mais le serveur ne le détectera pas ainsi parce qu'il ne peut pas « voir » la connexion entre la valeur insérée et les lectures précédentes. Il existe aussi quelques cas spécifiques pour lesquels le serveur renverra une erreur d'unicité ou de contrainte d'exclusion même si, en principe, il a suffisamment d'informations pour déterminer qu'un problème de sérialisation en est la cause sous-jacente. Alors qu'il est recommendable de seulement tester de nouveau les erreurs serialization_failure de façon inconditionnelle, plus d'attention est nécessaire lors de nouvelles tentatives avec ces autres codes d'erreur car ils pourraient représenter des conditions d'erreur persistentes plutôt que des échecs temporaires.

Il est important de ré-essayer la transaction complète, incluant toute la logique qui décide quel SQL envoyer et/ou quelles valeurs utiliser. De ce fait, PostgreSQL n'offre pas une capacité de tentatives automatiques car il ne peut le faire sans garantie d'exactitude.

Une nouvelle tentative ne garantit pas que la transaction nouvellement essayée se termine ; plusieurs essais pourraient se révéler nécessaires. Dans les cas avec une contention très haute, il est possible que la fin d'une transaction demande de nombreuses tentatives. Dans les cas impliquant une transaction préparée en conflit, il pourrait être impossible de progresser jusqu'à ce que la transaction préparée soit validée ou annulée.