не ЗА АКТУАЛИЗАЦИЯ
заключва само тези редове , така че друга транзакция, която се опитва да ги заключи (с FOR SHARE
, ЗА АКТУАЛИЗАЦИЯ
, АКТУАЛИЗАЦИЯ
или ИЗТРИВАНЕ
) блокира, докато транзакцията ви не бъде ангажирана или отменена.
Ако искате заключване на цяла таблица, което блокира вмъквания/актуализации/изтривания, вероятно искате ЗАКЛЮЧВАНЕ НА ТАБЛИЦА ... В ЕКСКЛУЗИВЕН РЕЖИМ
.
-
Вижте
lock_timeoutкод> настройка
. Това беше добавено в 9.3 и не е налично в по-стари версии.Груби приближения за по-стари версии могат да бъдат постигнати с
statement_timeout
, но това може да доведе до ненужно анулиране на изявления. Акоstatement_timeout
е 1s и оператор чака 950ms при заключване, след това може да получи заключването и да продължи, само за да бъде незабавно отменен от изчакване. Не е това, което искате.Няма начин на ниво заявка за задаване на
lock_timeout
, но вие можете и трябва просто:SET LOCAL lock_timeout ='1s';
след като
НАЧАЛЕТЕ
транзакция. -
Има изявление изчакване, но заключванията се задържат при транзакция ниво. Няма функция за изчакване на транзакцията.
Ако изпълнявате транзакции с едно изявление, можете просто да зададете
statement_timeout
преди да изпълните израза, за да ограничите колко дълго може да работи. Това обаче не е същото нещо като ограничаването на колко дълго може да задържи заключване, защото може да изчака 900 ms от позволените 1s за заключването, всъщност да задържи заключването само за 100 ms, след което да бъде отменено от времето за изчакване. -
Не. Трябва:
BEGIN; SET LOCAL lock_timeout = '4s'; SELECT ....; COMMIT;
-
НАСТРОЙ ЛОКАЛНО
е подходящо и предпочитано за това.Няма начин да го направите в текста на заявката, трябва да е отделно изявление.
Публикацията в пощенския списък, към която се свързахте, е предложение за въображаем синтаксис, който никога не е бил прилаган (поне в публична версия на PostgreSQL) и не съществува.
В ситуация като тази може да помислите за "оптимистичен контрол на паралелността", често наричан "оптимистично заключване". Дава ви по-голям контрол върху поведението при заключване с цената на увеличени честоти на повторение на заявките и необходимостта от повече логика на приложението.