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
.
-
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. Hvisstatement_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. -
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. -
Nej. Du skal:
BEGIN; SET LOCAL lock_timeout = '4s'; SELECT ....; COMMIT;
-
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.