sql >> Database teknologi >  >> RDS >> PostgreSQL

Kontroller varigheden af ​​PostgreSQL-lås venter

Nix. TIL OPDATERING låser kun disse rækker , så en anden transaktion, der forsøger at låse dem (med FOR SHARE , TIL OPDATERING , OPDATERING eller SLET ) blokerer, indtil din transaktion forpligtes eller ruller tilbage.

Hvis du vil have en hel tabellås, der blokerer indsættelser/opdateringer/sletninger, vil du sandsynligvis have LÅS TABEL ... I EKSKLUSIV TILSTAND .

  1. Se lock_timeout indstilling . Dette blev tilføjet i 9.3 og er ikke tilgængeligt i ældre versioner.

    Grove tilnærmelser for ældre versioner kan opnås med statement_timeout , men det kan føre til, at erklæringer annulleres unødigt. Hvis statement_timeout er 1s og en erklæring venter 950ms på en lås, kan den derefter få låsen og fortsætte, kun for straks at blive annulleret af en timeout. Ikke hvad du ønsker.

    Der er ingen måde at indstille lock_timeout på på forespørgselsniveau , men du kan og skal bare:

    SET LOCAL lock_timeout ='1s';

    efter du BEGIN en transaktion.

  2. Der er en erklæring timeout, men låse holdes ved transaktion niveau. Der er ingen transaktionstimeoutfunktion.

    Hvis du kører enkeltudsagnstransaktioner, kan du bare indstille en statement_timeout før du kører erklæringen for at begrænse, hvor længe den kan køre. Dette er dog ikke helt det samme som at begrænse, hvor længe den kan holde en lås, fordi den kan vente 900 ms af en tilladt 1s på låsen, kun holde låsen i 100 ms og derefter blive annulleret ved timeout.

  3. Nej. Du skal:

    BEGIN;
    SET LOCAL lock_timeout = '4s';
    SELECT ....;
    COMMIT;
    
  4. INDSTIL LOKAL er velegnet og foretrukket til dette.

    Der er ingen måde at gøre det i teksten til forespørgslen, det skal være en separat erklæring.

    Det postlisteindlæg, du linkede til, er et forslag til en imaginær syntaks, der aldrig blev implementeret (i det mindste i en offentlig PostgreSQL-udgivelse) og ikke eksisterer.

I en situation som denne kan du overveje "optimistisk samtidighedskontrol", ofte kaldet "optimistisk låsning". Det giver dig større kontrol over låseadfærd på bekostning af øget frekvens af forespørgselsgentagelser og behovet for mere applikationslogik.




  1. MySQL-gruppering efter uge, baseret på en datokolonne?

  2. Parametriseret tabelnavn

  3. MySQL hvor klausul og bestilling efter avg() som en underforespørgsel

  4. Måler du SQL Server-ydeevne med disse metrics?