sql >> Databasteknik >  >> RDS >> PostgreSQL

Kontrollera varaktigheten för PostgreSQL-lås väntar

Nej. FÖR UPPDATERING låser endast dessa rader , så att en annan transaktion som försöker låsa dem (med FOR SHARE , FÖR UPPDATERING , UPPDATERA eller DELETE ) blockerar tills din transaktion genomförs eller återställs.

Om du vill ha ett helt tabelllås som blockerar infogningar/uppdateringar/borttagningar vill du förmodligen ha LÅS TABELL ... I EXKLUSIVT LÄGE .

  1. Se lock_timeout inställning . Detta lades till i 9.3 och är inte tillgängligt i äldre versioner.

    Grova uppskattningar för äldre versioner kan uppnås med statement_timeout , men det kan leda till att uttalanden annulleras i onödan. Om statement_timeout är 1s och ett uttalande väntar 950ms på ett lås, kan det då få låset och fortsätta, bara för att omedelbart avbrytas av en timeout. Inte vad du vill.

    Det finns inget sätt på frågenivå att ställa in lock_timeout , men du kan och bör bara:

    SET LOCAL lock_timeout ='1s';

    efter att du BÖRJAR en transaktion.

  2. Det finns ett uttalande timeout, men lås hålls vid transaktion nivå. Det finns ingen tidsgräns för transaktioner.

    Om du kör transaktioner med ett utdrag kan du bara ställa in en statement_timeout innan du kör uttalandet för att begränsa hur länge det kan köras. Detta är inte riktigt samma sak som att begränsa hur länge det kan hålla ett lås, eftersom det kan vänta 900 ms av en tillåten 1:a på låset, bara hålla låset i 100 ms och sedan avbrytas vid timeout.

  3. Nej. Du måste:

    BEGIN;
    SET LOCAL lock_timeout = '4s';
    SELECT ....;
    COMMIT;
    
  4. STÄLL IN LOKAL är lämplig och föredragen för detta.

    Det finns inget sätt att göra det i texten i frågan, det måste vara ett separat uttalande.

    Mailinglistinlägget du länkade till är ett förslag på en tänkt syntax som aldrig implementerades (åtminstone i en offentlig PostgreSQL-release) och som inte existerar.

I en situation som denna kanske du vill överväga "optimistisk samtidighetskontroll", ofta kallad "optimistisk låsning". Det ger dig större kontroll över låsbeteendet till priset av ökad frekvens av frågeupprepning och behovet av mer applikationslogik.




  1. Jämför Amazon RDS Point-in-Time Recovery med ClusterControl

  2. Hur ansluter man R till Oracle?

  3. Oracle SQL:Filtrering efter ROWNUM returnerar inte resultat när det borde

  4. Använda MySQL-replikering (Master/Slave) med MyBatis