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.