Ако искате да заключите таблицата в конкретен избран ред, трябва да 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
преди да приключи първата транзакция. Той ще изчака първата транзакция да приключи и ще избере веднага след нея.
Използвам го във функция за контрол на подпоследователности и е страхотно. Надявам се да ви хареса.