PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 13/07/2022 07:11:08

jbd
Membre

Update concurrent - besoin de lock ?

Bonjour,

Je m'interroge sur la requête type suivante : UPDATE table set user_id = 'xxx' where user_id is null limit 1

J'ai toujours pensé que cette requête était safe d'un point de vue concurrence, que même en cas de stress sur la db, même avec des milliers d'execution en parallèle, il ne pouvait pas y avoir d'écrasement d'une requête sur une autre.

Or, récemment, on m'a fait douté et indiqué que je devrais locker lors de l'update.

Je n'ai pas réussi à trouver d'info à ce sujet.

D'ou ma question,

Est il possible, qu'une meme ligne respectant la clause where (user_id is null) puisse être "sélectionneé" pour être updatée par deux requêtes en parallèle et que la dernier requête qui écrit, écrase la valeur de la premiere ?

Merci d'avance

Hors ligne

#2 13/07/2022 12:01:55

rjuju
Administrateur

Re : Update concurrent - besoin de lock ?

Bonjour,


Sur postgres au moins cet ordre fera bien ce qu'il est censé faire, et n'écrasera pas une ligne modifiée de manière concurrente, car le prédicat est revérifié en cas de modification concurrente, cf https://www.postgresql.org/docs/current … -COMMITTED

Hors ligne

#3 13/07/2022 13:01:03

dverite
Membre

Re : Update concurrent - besoin de lock ?

UPDATE n'admet pas de clause LIMIT en Postgres, donc la requête telle que proposée n'est pas possible.

Il faudrait plutôt poser la question avec une vraie requête, car la revérification que mentionne Julien en #2 ne suffit pas forcément quand il y a des sous-requêtes.

Vous pouvez tester les UPDATE concurrents à la main avec deux sessions psql en parallèle et des BEGIN COMMIT explicites.

Hors ligne

#4 13/07/2022 14:16:11

jbd
Membre

Re : Update concurrent - besoin de lock ?

Ha ok, merci, j'avais pas cette notion de limit, cette requête était faite sur mysql à l"époque, et je l'avais énoncé de mémoire.

du coup, on est obligé de faire du select for update j'imagine dans ce cas

Hors ligne

Pied de page des forums