Ако искате да заключите таблицата в конкретен избран ред, трябва да LOCK FIRST те използват FOR UPDATE / FOR SHARE statement.Например, във вашия случай, ако трябва да заключите първия ред, направете следното:
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;
В BLOCK1 преди SELECT декларация, че не правите нищо, само казвате на базата данни „Хей, ще направя нещо в тази таблица, така че когато го направя, заключете тази таблица в този режим“. Можете да изберете / актуализирате / изтриете всеки ред.
Но в BLOCK2 когато използвате FOR UPDATE заключвате този ред към други транзакции в конкретни режими (прочетете doc за повече информация). Ще бъде заключено, докато транзакцията приключи.
Ако имате нужда от пример, направете тест и опитайте да направите друг SELECT ... FOR UPDATE в BLOCK2 преди да приключи първата транзакция. Той ще изчака първата транзакция да приключи и ще избере веднага след нея.
Използвам го във функция за контрол на подпоследователности и е страхотно. Надявам се да ви хареса.