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

Quand sélectionne-t-on pour verrouiller et déverrouiller la mise à jour ?

Les verrous sont pris pendant (généralement au début ou vers le début) l'exécution d'une commande. Les verrous (à l'exception des verrous consultatifs) sont libérés uniquement lorsqu'une transaction est validée ou annulée. Il n'y a pas de FOR UNLOCK , il n'y a pas non plus de UNLOCK commande pour inverser les effets du LOCK au niveau de la table commande. Tout cela est expliqué dans la section sur le contrôle de la concurrence de la documentation PostgreSQL.

Vous devez valider ou annuler votre transaction pour libérer les verrous.

De plus, cela n'a pas vraiment de sens de demander "cette ligne a-t-elle déjà été supprimée par une autre transaction simultanée". Il n'est pas vraiment supprimé tant que la transaction qui a supprimé la ligne n'est pas validée... et même alors, il se peut qu'elle ait supprimé et réinséré la ligne ou qu'une autre transaction simultanée ait inséré la ligne à nouveau.

Construisez-vous par hasard une file d'attente de tâches ou un système de file d'attente de messages, car si c'est le cas, ce problème est résolu et vous ne devriez pas essayer de réinventer cette roue inhabituellement compliquée. Voir PGQ, ActiveMQ, RabbitMQ, ZeroMQ, etc. (les futures versions de PostgreSQL peuvent inclure FOR UPDATE SKIP LOCKED car cela est en cours de test, mais n'a pas été publié au moment de la rédaction).

Je vous suggère de poster une nouvelle question avec une description plus détaillée du problème sous-jacent que vous essayez de résoudre. Vous supposez que la solution à votre problème est "découvrir si la ligne a déjà été supprimée" ou "déverrouiller la ligne". Ce n'est probablement pas vraiment la solution. C'est un peu comme si quelqu'un disait "où puis-je acheter de l'essence" quand son vélo à pousser ne marche pas et qu'il suppose qu'il n'a plus de carburant. Le carburant n'est pas le problème, le problème est que les vélos à pousser ne consomment pas de carburant et que vous devez les pédaler.

Expliquez le contexte. Expliquez ce que vous essayez d'accomplir. Surtout, ne postez pas de pseudocode, postez le code réel avec lequel vous rencontrez des problèmes , de préférence sous une forme autonome et exécutable.