J'utilise une table intermédiaire que je mets à jour pour m'assurer qu'aucune autre action simultanée ne peut être traitée sur une table critique qui ne doit pas être accédée simultanément.Protection des tables de ressources critiques dans une clause CTE (WITH)
Transaction 1
BEGIN
UPDATE locktable
/* Do some stuff */
...
COMMIT
transaction concurrente 2
BEGIN
Update locktable
/* Do some other stuff */
...
COMMIT
De cette façon, je suis sûr que la transaction 1 et 2 sont la transaction atomique. J'ai changé mon code en une clause clause WITH pour des raisons de simplification et de performance. Je me demande si je peux garantir l'atomicité de fonctionnement de la même manière avec les CTE.
CTE Exemple simplifié:
Transaction 1
WITH
lock_op AS (
UPDATE locktable
...
RETURNING id),
some_stuff AS
(
/* Do insert and update operations with RETURNING clause*/
...
)
SELECT *
FROM some_stuff
WHERE EXISTS (SELECT 1 FROM lock_op)
transaction concurrente 2
WITH
lock_op AS (
UPDATE locktable
...
RETURNING id),
other_stuff AS
(
/* Do insert and update operations with RETURNING clause*/
...
)
SELECT *
FROM other_stuff
WHERE EXISTS (SELECT 1 FROM lock_op)
En fait, je me demande si "SELECT 1 FROM lock_op" est initiée avant toute INSERT et UPDATE de some_stuff et other_stuff et par conséquent, protège mes données critiques pour le moment de la transaction délimitée par la portée WITH?
Merci pour cette réponse très claire.Je pense que je vais opter pour une solution hybride mettant en œuvre deux requêtes distinctes: 1/une pour verrouiller la table lock_op et 2/une autre pour le CTE. Les deux dans une seule transaction. Mon CTE contient de nombreuses commandes qui doivent être globalement atomiques pour des raisons de cohérence et (si j'ai bien compris) SELECT FOR UPDATE ne garantira que des opérations individuelles à préserver des accès/changements simultanés. – Nitseg
Si vous avez besoin d'une isolation globale, envisagez un verrou consultatif. Il devrait être beaucoup moins cher que 'SELECT ... FOR UPDATE' -ing une table de verrouillage à une rangée. –
Merci pour l'indice. Je ne connaissais pas les verrous consultatifs. Il pourrait éventuellement répondre à mes besoins puisque toutes les opérations que j'ai besoin d'isoler sont liées à un seul identifiant que je peux fournir à la fonction pg_advisory_lock. – Nitseg