J'ai une série d'instructions SQL qui ressemblent à ceci:
BEGIN;
SELECT counter FROM table WHERE id=X FOR UPDATE;
REALLY COMPLEX QUERY;
UPDATE table SET counter=Y WHERE id=X;
END;
Je voudrais empêcher le compteur d'être lu pendant que je recalcule sa valeur, mais selon les documents Postgres "Les verrous au niveau des lignes n'affectent pas l'interrogation des données; ils bloquent uniquement les écrivains sur la même ligne."
Des questions:
- Quel est l'intérêt d'un verrou de ligne "exclusif" s'il n'empêche pas les lectures? Est-ce uniquement pour empêcher d'autres transactions de prendre des verrous de partage?
- Si je lis la ligne avec SELECT ... FOR SHARE, cela a-t-il le même effet qu'un verrou "exclusif"?
- Est-il possible de désactiver MVCC pour une table / schéma / base de données et d'autoriser les écritures sur place?
la source