4 votes

Verrouillage du gap PostgreSQL par SELECT ... FOR UPDATE

Il y a une requête avec un Verrouillage de l'espace utilisé à MySQL/InnoDB :

SELECT id, time, count
FROM table_a
WHERE time
    BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR)
    AND NOW()
FOR UPDATE

Il verrouille le time et renvoie un enregistrement récent s'il est présent (au cours des dernières 24 heures). Si ce n'est pas le cas, la session possède toujours un verrou sur la durée des dernières 24 heures pour insérer un nouvel enregistrement en toute sécurité.

Est-il possible de faire le même gap lock pendant toute la durée de 24 heures (même s'il n'y a pas d'enregistrements) dans PostgreSQL ?

1voto

Laurenz Albe Points 40920

La façon de le faire dans PostgreSQL est d'utiliser la fonction SERIALIZABLE niveau d'isolement pour toutes les transactions.

Alors vous n'avez pas besoin de la FOR UPDATE du tout. PostgreSQL n'empêchera pas l'insertion de lignes dans l'espace, mais si deux transactions lisent et écrivent simultanément des valeurs dans le même espace, l'une d'entre elles obtiendra une erreur de sérialisation et devra refaire la transaction (au deuxième essai, elle trouvera l'espace non vide).

Le concept à l'œuvre ici est la sérialisation : il est acceptable que quelqu'un d'autre insère dans l'intervalle sans lire (cette transaction est logiquement après celui avec votre SELECT ). Mais si deux transactions trouvent toutes les deux l'espace vide et insèrent ensuite quelque chose, cela créerait une anomalie qui est empêchée par SERIALIZABLE .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X