Opérations PostgreSQL UPSERT et clause RETURNING : gestion des conflits
PostgreSQL INSERT ... ON CONFLICT
fournit une fonctionnalité d'upsert, combinant l'insertion et les mises à jour. Cependant, l'utilisation de DO NOTHING
avec la clause RETURNING
peut conduire à des résultats incomplets dans des scénarios simultanés.
Problème de concurrence 1 : lignes renvoyées manquantes
Si une autre transaction modifie la ligne cible avant la fin de votre INSERT ... ON CONFLICT
, l'upsert peut ne pas détecter le conflit, ce qui entraînera des lignes manquantes dans la sortie RETURNING
.
Solutions :
Plusieurs approches atténuent cela :
RETURNING
. Les divergences indiquent des lignes manquantes, ce qui entraîne une réexécution de l'instruction.Problème de concurrence 2 : verrouillage des lignes
Pour les transactions nécessitant des verrous de ligne, utilisez ON CONFLICT DO UPDATE
avec WHERE FALSE
. Cela verrouille les lignes sans les modifier. Combinez cela avec SELECT ... FOR UPDATE
pour un verrouillage supplémentaire.
Gestion et conversion des types de données pour plus de robustesse
Les solutions existantes sont insuffisantes pour tous les scénarios simultanés. Une approche plus globale implique :
Faible simultanéité :
INSERT
et SELECT UNION
pour différencier les lignes insérées et sélectionnées.Concurrence élevée :
INSERT ... ON CONFLICT
CTE pour gérer la concurrence.Évitement des impasses :
Un ordre d'insertion cohérent minimise les occurrences de blocage.
Gestion des types de données :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!