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

Контролиране на продължителността на изчакване за заключване на PostgreSQL

не ЗА АКТУАЛИЗАЦИЯ заключва само тези редове , така че друга транзакция, която се опитва да ги заключи (с FOR SHARE , ЗА АКТУАЛИЗАЦИЯ , АКТУАЛИЗАЦИЯ или ИЗТРИВАНЕ ) блокира, докато транзакцията ви не бъде ангажирана или отменена.

Ако искате заключване на цяла таблица, което блокира вмъквания/актуализации/изтривания, вероятно искате ЗАКЛЮЧВАНЕ НА ТАБЛИЦА ... В ЕКСКЛУЗИВЕН РЕЖИМ .

  1. Вижте lock_timeout настройка . Това беше добавено в 9.3 и не е налично в по-стари версии.

    Груби приближения за по-стари версии могат да бъдат постигнати с statement_timeout , но това може да доведе до ненужно анулиране на изявления. Ако statement_timeout е 1s и оператор чака 950ms при заключване, след това може да получи заключването и да продължи, само за да бъде незабавно отменен от изчакване. Не е това, което искате.

    Няма начин на ниво заявка за задаване на lock_timeout , но вие можете и трябва просто:

    SET LOCAL lock_timeout ='1s';

    след като НАЧАЛЕТЕ транзакция.

  2. Има изявление изчакване, но заключванията се задържат при транзакция ниво. Няма функция за изчакване на транзакцията.

    Ако изпълнявате транзакции с едно изявление, можете просто да зададете statement_timeout преди да изпълните израза, за да ограничите колко дълго може да работи. Това обаче не е същото нещо като ограничаването на колко дълго може да задържи заключване, защото може да изчака 900 ms от позволените 1s за заключването, всъщност да задържи заключването само за 100 ms, след което да бъде отменено от времето за изчакване.

  3. Не. Трябва:

    BEGIN;
    SET LOCAL lock_timeout = '4s';
    SELECT ....;
    COMMIT;
    
  4. НАСТРОЙ ЛОКАЛНО е подходящо и предпочитано за това.

    Няма начин да го направите в текста на заявката, трябва да е отделно изявление.

    Публикацията в пощенския списък, към която се свързахте, е предложение за въображаем синтаксис, който никога не е бил прилаган (поне в публична версия на PostgreSQL) и не съществува.

В ситуация като тази може да помислите за "оптимистичен контрол на паралелността", често наричан "оптимистично заключване". Дава ви по-голям контрол върху поведението при заключване с цената на увеличени честоти на повторение на заявките и необходимостта от повече логика на приложението.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не може веднага да получи множество известия в Npgsql

  2. Персонализирано SERIAL / автоматично увеличение на група стойности

  3. Съществува ред за проверка на Python psycopg2

  4. Postgresql - Заявката работи много по-бързо с enable_nestloop=false. Защо проектантът не прави правилното нещо?

  5. Клаузите WHERE и JOIN подреждат изпълнението