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

Verrouiller une ligne spécifique dans postgres

Si vous souhaitez verrouiller la table dans une ligne sélectionnée spécifique, vous devez LOCK FIRST eux utilisent le FOR UPDATE / FOR SHARE déclaration. Par exemple, dans votre cas, si vous devez verrouiller la première ligne, procédez comme suit :

BEGIN;

LOCK TABLE person IN ROW EXCLUSIVE MODE;

-- BLOCK 1

SELECT * FROM person WHERE name = 'John' and money = 1 FOR UPDATE;

-- BLOCK 2

UPDATE person set name = 'John 2' WHERE name = 'John' and money = 1;

END;

Dans le BLOCK1 avant le SELECT déclaration, vous ne faites rien en disant simplement à la base de données "Hé, je vais faire quelque chose dans cette table, alors quand je le ferai, verrouillez cette table dans ce mode". Vous pouvez sélectionner / mettre à jour / supprimer n'importe quelle ligne.

Mais dans BLOCK2 lorsque vous utilisez le FOR UPDATE vous verrouillez cette ligne sur d'autres transactions dans des modes spécifiques (lisez la doc pour plus de détails). Sera verrouillé jusqu'à la fin de cette transaction.

Si vous avez besoin d'un exemple, faites un test et essayez de faire un autre SELECT ... FOR UPDATE dans BLOCK2 avant de terminer la première transaction. Il attendra la fin de la première transaction et sélectionnera juste après.

Je l'utilise dans une fonction pour contrôler les sous-séquences et c'est génial. J'espère que vous apprécierez.