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
.
-
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. Omstatement_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. -
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. -
Nej. Du måste:
BEGIN; SET LOCAL lock_timeout = '4s'; SELECT ....; COMMIT;
-
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.