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

verrouiller les lignes jusqu'à la prochaine sélection de postgres

Je ne pense pas que ce soit possible. Vous ne pouvez pas bloquer un accès en lecture seule à une table (sauf si cette sélection est effectuée FOR UPDATE )

Autant que je sache, la seule chance que vous avez est d'utiliser le pg_advisory_lock() fonction.
http://www .postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS

Mais cela nécessite une libération "manuelle" des verrous obtenus grâce à elle. Vous n'obtiendrez pas de déverrouillage automatique avec cela.

Pour verrouiller les lignes, vous auriez besoin de quelque chose comme ceci :

select pg_advisory_lock(id), * 
from 
( 
  select * table1 order by id limit 5
) t

(Notez l'utilisation de la table dérivée pour la partie LIMIT. Voir le lien manuel que j'ai posté pour une explication)

Ensuite, vous devez stocker les identifiants récupérés et appeler ultérieurement pg_advisory_unlock() pour chaque identifiant.

Si chaque processus libère toujours tous ID à la fois, vous pouvez simplement utiliser pg_advisory_unlock_all() Au lieu. Vous n'aurez alors pas besoin de stocker les identifiants récupérés.

Notez que cela ne sera pas empêcher les autres de lire les lignes à l'aide de sélections "normales". Cela ne fonctionnera que si chaque processus qui accède à cette table utilise le même modèle d'obtention des verrous.