Вашият въпрос, препращащ към неизвестен източник:
Разгледах заключване на редове, но пише, че не можете да предотвратите selectstatements, което звучи така, сякаш няма да работи за моето състояние тук. Единствената ми опция ли е да използвам съветни ключалки?
Официалната документация по въпроса:
Заключването на ниво ред не засяга заявките за данни; блокират самописчи и шкафчета на същия ред.
Едновременните опити не просто ще избират, но ще се опитат да извадят едно и също заключване на ниво ред с SELECT ... FOR UPDATE
- което ги кара да чакат всяка предишна транзакция, задържаща заключване на същия ред, за да завършат или да се върнат назад. Точно това, което искахте.
Въпреки това , много случаи на употреба са по-добре решени ссъветни брави - във версии преди 9.5. Все още можете да заключвате редове, които се обработват с FOR UPDATE
освен това, за да бъдат безопасни. Но ако следващата транзакция просто иска да обработи „следващия безплатен ред“, това често е много по-ефективно да не чакате същия ред, който почти сигурно е недостъпен след освобождаването на ключалката, но незабавно да преминете към "следващия безплатен".
В Postgres 9.5+ помислете за FOR UPDATE SKIP LOCKED
за това. Както коментира @Craig, това може до голяма степен да замени препоръчителните заключвания.
Свързан въпрос, препънат в същата производителност:
- Функцията отнема вечно да се изпълнява за голям брой записи
Обяснение и пример за код за съветни брави или FOR UPDATE SKIP LOCKED
в Postgres 9.5+:
- Актуализиране на Postgres... ОГРАНИЧЕНИЕ 1
За заключване на много редове наведнъж :
- Как да маркирате определен брой редове в таблицата при едновременен достъп