PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Verrouiller pour SELECT afin qu'un autre processus n'obtienne pas d'anciennes données

Votre question, faisant référence à une source inconnue :

J'ai examiné le verrouillage des lignes, mais il est indiqué que vous ne pouvez pas empêcher les instructions de sélection, ce qui semble ne pas fonctionner pour ma condition ici. Est-ce ma seule option pour utiliser les verrous consultatifs ?

La documentation officielle en la matière :

Les verrous au niveau de la ligne n'affectent pas l'interrogation des données ; ils ne bloquent que les écrivains et les casiers à la même ligne.

Les tentatives simultanées ne se contenteront pas de sélectionner, mais essaieront de supprimer le même verrou au niveau de la ligne avec SELECT ... FOR UPDATE - ce qui les oblige à attendre que toute transaction précédente détenant un verrou sur la même ligne soit validée ou annulée. Exactement ce que vous vouliez.

Cependant , de nombreux cas d'utilisation sont mieux résolus avec des verrous consultatifs - dans les versions antérieures à 9.5. Vous pouvez toujours verrouiller les lignes en cours de traitement avec FOR UPDATE en plus d'être en sécurité. Mais si la prochaine transaction veut juste traiter "la prochaine ligne libre", c'est souvent beaucoup plus efficace de ne pas attendre la même ligne, qui est presque certainement indisponible après la libération du verrou, mais de passer immédiatement à la "prochaine libre".

Dans Postgres 9.5+, considérez FOR UPDATE SKIP LOCKED pour ça. Comme @Craig l'a commenté, cela peut largement remplacer les verrous consultatifs.

Question connexe trébuchant sur le même porc de performance :

  • Fonction prenant une éternité à s'exécuter pour un grand nombre d'enregistrements

Explication et exemple de code pour les verrous consultatifs ou FOR UPDATE SKIP LOCKED dans Postgres 9.5+ :

  • MISE À JOUR Postgres... LIMITER 1

Pour verrouiller plusieurs lignes à la fois :

  • Comment marquer un certain nombre de lignes dans le tableau lors d'un accès simultané