PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Заключете за SELECT, така че друг процес да не получи стари данни

Вашият въпрос, препращащ към неизвестен източник:

Разгледах заключване на редове, но пише, че не можете да предотвратите 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

За заключване на много редове наведнъж :

  • Как да маркирате определен брой редове в таблицата при едновременен достъп


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добавяне на нова стойност към съществуващ тип ENUM

  2. Различни timezone_types на DateTime обект

  3. вземете таблица JOIN като масив от резултати с PostgreSQL/NodeJS

  4. Грешка в Postgres:Повече от един ред, върнати от подзаявка, използвана като израз

  5. Защо достъпът до PostgreSQL масива е толкова по-бърз в C, отколкото в PL/pgSQL?