Unlocking the Postgres Lock Manager. Bruce Momjian

Tolkning av Bruce Momjian sin rapport fra 2020 "Unlocking the Postgres Lock Manager".

Unlocking the Postgres Lock Manager. Bruce Momjian

(Merk: Alle SQL-forespÞrslene fra lysbildene kan du fÄ tilgang til via denne lenken: http://momjian.us/main/writings/pgsql/locking.sql)

Hei! Det er flott Ä vÊre her igjen i Russland. Jeg beklager at jeg ikke kunne komme i fjor, men i Är har Ivan og jeg store planer. Jeg hÄper Ä vÊre her mye oftere. Jeg elsker Ä reise til Russland. Jeg skal besÞke Tyumen og Tver. Jeg er veldig glad for at jeg fÄr muligheten til Ä besÞke disse byene.

Jeg heter Bruce Momjian. Jeg jobber i EnterpriseDB og har jobbet med Postgres i mer enn 23 Är. Jeg bor i Philadelphia, USA. Jeg reiser omtrent 90 dager i Äret og deltar pÄ omtrent 40 konferanser. Min nettside, som inneholder lysbilder som jeg nÄ skal vise dere. Etter konferansen kan dere laste dem ned fra min personlige side. Der finner dere ogsÄ rundt 30 presentasjoner, videoinnhold og et stort antall blogginnlegg, mer enn 500. Dette er en ganske innholdsrik ressurs, og hvis dere er interessert i dette materialet, Þnsker jeg dere velkommen til Ä ta nytte av det.

Jeg har tidligere vÊrt lÊrer, professor fÞr jeg begynte Ä jobbe med Postgres. Jeg er veldig glad for nÄ Ä fÄ fortelle dere det jeg skal fortelle. Dette er en av de mest interessante presentasjonene mine, og den inneholder 110 lysbilder. Vi starter med enkle emner, og mot slutten av presentasjonen vil det bli stadig mer komplisert.

Unlocking the Postgres Lock Manager. Bruce Momjian

Dette er en ganske ubehagelig samtale. LÄsning er ikke det mest populÊre emnet. Vi Þnsker at det skal forsvinne. Det er som Ä dra til tannlegen.

Unlocking the Postgres Lock Manager. Bruce Momjian

  1. LÄsing er et problem for mange mennesker som jobber med databaser og hvor flere prosesser kjÞrer samtidig. De trenger lÄsing. Jeg vil gi dere grunnleggende kunnskap om lÄsing i dag.
  2. Transaksjonsidentifikatorer. Dette er en ganske kjedelig del av presentasjonen, men de mÄ forstÄs.
  3. Videre skal vi snakke om typer lÄsing. Dette er en ganske mekanisk del.
  4. Og deretter vil vi gÄ gjennom noen eksempler pÄ lÄsing. Dette vil bli ganske vanskelig Ä forstÄ.

Unlocking the Postgres Lock Manager. Bruce Momjian

La oss snakke om lÄsinger.

Unlocking the Postgres Lock Manager. Bruce Momjian

Terminologien er temmelig kompleks hos oss. Hvor mange av dere vet hvor dette utdraget kommer fra? To personer. Det er fra et spill som heter «Kolosalt eventyr i hulen». Det var et tekstbasert dataspill pÄ 80-tallet, tror jeg. Man mÄtte gÄ inn i en hule, i en labyrint, og teksten endret seg, men innholdet var omtrent det samme hver gang. Slik husker jeg dette spillet.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og her ser vi navnene pÄ blokkeringene som kommer fra Oracle. Vi bruker dem.

Unlocking the Postgres Lock Manager. Bruce Momjian

Her ser vi termer som forvirrer meg. For eksempel, SHARE UPDATE EXCLUSIVE. Deretter SHARE RAW EXCLUSIVE. Ærlig talt, disse navnene er ikke veldig klare. Vi skal prĂžve Ă„ se nĂŠrmere pĂ„ dem. Noen inneholder ordet «share», som betyr – Ă„ skille seg. Noen inneholder ordet «exclusive» — eksklusiv. I noen finnes begge disse ordene. Jeg vil gjerne begynne med hvordan disse blokkeringene fungerer.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og det er ogsĂ„ veldig viktig ordet «access» — tilgang. Og ordet «row» — rad. Det vil si distribusjon av tilgang, distribusjon av rader.

Unlocking the Postgres Lock Manager. Bruce Momjian

Et annet problem som mÄ forstÄs i Postgres, jeg kan dessverre ikke fortelle om det i mitt innlegg, er MVCC. Jeg har en egen presentasjon om dette emnet pÄ nettstedet mitt. Og hvis du tror at denne presentasjonen er komplisert, sÄ er MVCC nok min mest kompliserte. Og hvis du er interessert, kan du se den pÄ nettstedet. Du kan se videoen.

Unlocking the Postgres Lock Manager. Bruce Momjian

Et annet punkt vi mĂ„ forstĂ„ – er transaksjonsidentifikatorene. Mange transaksjoner kan ikke fungere uten unike identifikatorer. Her har vi en forklaring pĂ„ hva en transaksjon er. I Postgres finnes det to systemer for nummerering av transaksjoner. Jeg vet, dette er ikke en veldig pen lĂžsning.

Unlocking the Postgres Lock Manager. Bruce Momjian

VÊr ogsÄ oppmerksom pÄ at lysbildene vil vÊre relativt vanskelige Ä forstÄ, sÄ det som er uthevet i rÞdt, det mÄ vi legge sÊrlig merke til.

Unlocking the Postgres Lock Manager. Bruce Momjian

http://momjian.us/main/writings/pgsql/locking.sql

Se her. Numrene pÄ transaksjonen er uthevet i rÞdt. Her vises funksjonen SELECT pg_back. Den returnerer min transaksjon og ID-en til denne transaksjonen.

En annen ting, hvis du liker denne presentasjonen og Þnsker Ä starte den i databasen din, kan du fÞlge lenken som er markert med rosa, og laste ned SQL for denne presentasjonen. Du kan enkelt kjÞre den i PSQL-en din, og hele presentasjonen vil umiddelbart vises pÄ skjermen din. Den vil ikke inneholde farger, men i det minste vil vi kunne se den.

Unlocking the Postgres Lock Manager. Bruce Momjian

I dette tilfellet ser vi ID-en til transaksjonen. Dette er nummeret vi har gitt den. Det finnes ogsÄ en annen type transaksjons-ID i Postgres, kalt virtuell transaksjons-ID.

Og vi mÄ forstÄ dette. Det er veldig viktig, ellers kan vi ikke forstÄ lÄsing i Postgres.

Virtuell transaksjons-ID er ID-en til en transaksjon som ikke inneholder permanente verdier. For eksempel, hvis jeg kjÞrer en SELECT-kommando, kommer jeg sannsynligvis ikke til Ä endre databasen, jeg vil ikke blokkere noe. Derfor, nÄr vi kjÞrer en enkel SELECT, gir vi ikke denne transaksjonen en permanent ID. Vi gir den bare en virtuell ID.

Og dette Þker ytelsen til Postgres og forbedrer mulighetene for opprydding, derfor bestÄr den virtuelle transaksjons-ID-en av to tall. Det fÞrste tallet fÞr skrÄstreken er backend-ID-en. PÄ hÞyre side ser vi bare en teller.

Unlocking the Postgres Lock Manager. Bruce Momjian

SĂ„ hvis jeg kjĂžrer en spĂžrring, sier den at backend-ID-en er 2.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og hvis jeg kjÞrer en serie slike transaksjoner, ser vi at telleren Þker hver gang jeg kjÞrer en spÞrring. For eksempel nÄr jeg kjÞrer spÞrring 2/10, 2/11, 2/12 osv.

Unlocking the Postgres Lock Manager. Bruce Momjian

Legg merke til at det er to kolonner her. Til venstre ser vi den virtuelle transaksjons-ID-en – 2/12. PĂ„ hĂžyre side har vi den permanente transaksjons-ID-en. Og dette feltet er tomt. Denne transaksjonen modifiserer ikke databasen. Derfor tildeler jeg den ikke en permanent transaksjons-ID.

Unlocking the Postgres Lock Manager. Bruce Momjian

SÄ snart jeg kjÞrer kommandoen analyze (ANALYZE), gir den samme spÞrringen meg en permanent transaksjons-ID. Se hvordan dette har endret seg. FÞr hadde jeg ikke denne ID-en, nÄ har den dukket opp.

Unlocking the Postgres Lock Manager. Bruce Momjian

SÄ her er en annen spÞrring, en annen transaksjon. Den virtuelle transaksjonsnummeret er 2/13. Og hvis jeg ber om den permanente transaksjons-ID-en, vil jeg fÄ den nÄr jeg kjÞrer spÞrringen.

Unlocking the Postgres Lock Manager. Bruce Momjian

SÄ igjen. Vi har en virtuell transaksjons-ID og en permanent transaksjons-ID. Bare forstÄ dette punktet for Ä forstÄ oppfÞrselen til Postgres.

Unlocking the Postgres Lock Manager. Bruce Momjian

Vi gÄr videre til den tredje delen. Her vil vi bare se pÄ de ulike typene lÄser i Postgres. Det er ikke sÄ spennende. Den siste delen vil bli mye mer interessant. Men vi mÄ se pÄ det grunnleggende, ellers vil vi ikke forstÄ hva som kommer videre.

Vi skal gÄ gjennom denne delen, vi ser pÄ hver type lÄs. Og jeg vil vise deg eksempler pÄ hvordan de settes, hvordan de fungerer, og vise deg noen spÞrringer som kan brukes for Ä se hvordan lÄsing fungerer i Postgres.

Unlocking the Postgres Lock Manager. Bruce Momjian

For Ä lage en spÞrring og se hva som skjer i Postgres, mÄ vi kjÞre en spÞrring i systemvisningen. I dette tilfellet er pg_lock uthevet med rÞdt. Pg_lock er en systemtabel som forteller oss hvilke lÄser som brukes i Postgres for Þyeblikket.

Men det er veldig vanskelig for meg Ä vise deg pg_lock i seg selv, fordi det er ganske komplisert. Derfor har jeg laget en visning som viser pg_locks. Den gjÞr ogsÄ noe arbeid for meg, som gjÞr at jeg bedre kan forstÄ. Det vil si at den ekskluderer mine lÄser, min egen Þkt osv. Dette er bare standard SQL, og den lar meg vise deg bedre hva som skjer.

Unlocking the Postgres Lock Manager. Bruce Momjian

En annen utfordring er at denne visningen er veldig bred, sĂ„ jeg mĂ„tte lage en andre – lockview2.

Unlocking the Postgres Lock Manager. Bruce Momjian Den viser meg flere kolonner fra tabellen, og en annen som viser meg de gjenvÊrende kolonnene. Dette er ganske komplisert, sÄ jeg har prÞvd Ä presentere dette sÄ enkelt som mulig.

Unlocking the Postgres Lock Manager. Bruce Momjian

SÄ vi har opprettet en tabell som heter Lockdemo. Og vi har opprettet én rad der. Dette er vÄr eksempeltabell. Og vi skal lage seksjoner bare for Ä vise deg eksempler pÄ lÄsing.

Unlocking the Postgres Lock Manager. Bruce Momjian

SÄ, én rad, én kolonne. Den fÞrste typen lÄs kalles ACCESS SHARE. Dette er den minst restriktive lÄsen. Det betyr at den praktisk talt ikke konflikter med andre lÄser.

Og dersom vi vil definere lÄsingen eksplisitt, kjÞrer vi kommandoen «lock table». Dette vil tydelig lÄse den, altsÄ i ACCESS SHARE-modus kjÞrer vi lock table. Og hvis jeg kjÞrer PSQL i bakgrunnen, starter jeg pÄ denne mÄten en annen sesjon fra min fÞrste sesjon. Det vil si, hva gjÞr jeg her? Jeg gÄr til den andre sesjonen og sier: «vis meg lockview for denne forespÞrselen». Og her har jeg AccessShareLock i denne tabellen. Dette er akkurat det jeg ba om. Og den sier at lÄsen har blitt tildelt. Veldig enkelt.

Unlocking the Postgres Lock Manager. Bruce Momjian

Videre, hvis vi ser i den andre kolonnen, er det ingenting der. De er tomme.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og hvis jeg kjÞrer kommandoen «SELECT», er dette en implisitt mÄte Ä be om AccessShareLock pÄ. SÄ jeg slipper tabellen min og kjÞrer forespÞrselen, og forespÞrselen returnerer flere rader. Og i en av radene ser vi AccessShareLock. Dermed forÄrsaker SELECT AccessShareLock i tabellen. Og det konflikter praktisk talt ikke med noe, fordi det er en lÄs av lavt nivÄ.

Unlocking the Postgres Lock Manager. Bruce Momjian

Hva hvis jeg kjÞrer SELECT og har tre forskjellige tabeller? Tidligere kjÞrte jeg bare én tabell, nÄ kjÞrer jeg tre: pg_class, pg_namespace og pg_attribute.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og nÄ, nÄr jeg ser pÄ forespÞrselen, ser jeg 9 AccessShareLocks i de tre tabellene. Hvorfor? Tre tabeller er uthevet med blÄtt: pg_attribute, pg_class, pg_namespace. Men du kan ogsÄ se at alle indeksene som er definert gjennom disse tabellene, ogsÄ har AccessShareLock.

Og dette er en lÄs som praktisk talt ikke konflikter med andre. Alt den gjÞr, er Ä hindre oss fra Ä slippe tabellen sÄ lenge vi velger den. Det gir mening. Det vil si, hvis vi velger en tabell, skulle den pÄ det tidspunktet forsvinne, ville det vÊrt galt, sÄ AccessShare er en lÄs av lavt nivÄ som sier «ikke slett denne tabellen sÄ lenge jeg jobber». I bunn og grunn er dette alt den gjÞr.

Unlocking the Postgres Lock Manager. Bruce Momjian

ROW SHARE er en lÄs som er litt annerledes.

Unlocking the Postgres Lock Manager. Bruce Momjian

La oss ta et eksempel. SELECT ROW SHARE er en mÄte Ä lÄse hver rad individuelt. Dermed kan ingen slette dem eller endre dem sÄ lenge vi ser pÄ dem.

Unlocking the Postgres Lock Manager. Bruce MomjianSÄ, hva er SHARE LOCK? Vi ser at transaksjons-ID 681 er for SELECT. Og det er interessant. Hva har skjedd her? For fÞrste gang ser vi et nummer i "Lock"-feltet. Vi tar transaksjons-ID, og den sier at den lÄser det i eksklusiv modus. Alt den gjÞr, er Ä si at jeg har en rad som teknisk sett er lÄst et sted i tabellen. Men den sier ikke hvor spesifikt. Litt senere ser vi nÊrmere pÄ dette.

Unlocking the Postgres Lock Manager. Bruce Momjian

Her sier vi at lÄsing brukes av oss.

Unlocking the Postgres Lock Manager. Bruce Momjian

SÄ den eksklusive lÄsen sier eksplisitt at den er eksklusiv. Og ogsÄ hvis du sletter en rad i denne tabellen, vil det skje, som du kan se.

Unlocking the Postgres Lock Manager. Bruce Momjian

SHARE EXCLUSIVE – dette er en lengre lĂ„s.

Unlocking the Postgres Lock Manager. Bruce Momjian

Dette (ANALYZE) er analysekomenaden som vil bli brukt.

Unlocking the Postgres Lock Manager. Bruce Momjian

SHARE LOCK – du kan eksplisitt lĂ„se i delingsmodus.

Unlocking the Postgres Lock Manager. Bruce Momjian

Du kan ogsÄ opprette et unikt indeks. Og der kan du se SHARE LOCK, som er en del av dem. Og den lÄser tabellen og setter SHARE LOCK pÄ den.

Som standard betyr SHARE LOCK pÄ tabellen at andre kan lese tabellen, men ingen kan modifisere den. Og det er nettopp det som skjer nÄr du oppretter et unikt indeks.

Hvis jeg oppretter en unik samtidig indeks, vil jeg ha en annen type lÄsing, fordi, som du husker, bruk av samtidig indekser reduserer lÄsekravene. Og hvis jeg bruker normal lÄsing, normal indeks, vil jeg pÄ den mÄten forhindre skriving til indeksen under opprettelsen. Hvis jeg bruker samtidig indeks, mÄ jeg bruke en annen type lÄsing.

Unlocking the Postgres Lock Manager. Bruce Momjian

SHARE ROW EXCLUSIVE – den kan ogsĂ„ settes eksplisitt.

Unlocking the Postgres Lock Manager. Bruce Momjian

Eller vi kan lage en regel, dvs. ta et bestemt tilfelle der den vil bli brukt.

Unlocking the Postgres Lock Manager. Bruce Momjian

EXCLUSIVE-lÄsing betyr at ingen andre kan endre tabellen.

Unlocking the Postgres Lock Manager. Bruce Momjian

Her ser vi forskjellige typer lÄsinger.

Unlocking the Postgres Lock Manager. Bruce Momjian

ACCESS EXCLUSIVE, for eksempel, er en lÄsekommando. For eksempel, hvis du gjÞr CLUSTER table, betyr det at ingen kan skrive dit. Og den lÄser ikke bare selve tabellen, men ogsÄ indeksene.

Unlocking the Postgres Lock Manager. Bruce Momjian

Dette er den andre siden av ACCESS EXCLUSIVE lÄsing, hvor vi ser spesifikt hva den blokkerer i tabellen. Den blokkerer individuelle rader i tabellen, noe som er ganske interessant.

Dette er all den grunnleggende informasjonen jeg Þnsket Ä gi. Vi har snakket om lÄser, om transaksjons-ID-er, snakket om virtuelle transaksjons-ID-er, om permanente transaksjons-ID-er.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og nÄ skal vi se pÄ eksempler pÄ lÄser. Dette er den mest interessante delen. Vi skal se pÄ noen svÊrt interessante tilfeller. Og mitt mÄl med denne presentasjonen er Ä gi dere en bedre forstÄelse av hva Postgres faktisk gjÞr nÄr det prÞver Ä lÄse forskjellige ting. Jeg fÞler at den er veldig flink til Ä lÄse enkeltkomponenter.

La oss se pÄ spesifikke eksempler.

Unlocking the Postgres Lock Manager. Bruce Momjian

Vi begynner med tabeller og én rad i tabellen. NÄr jeg setter inn noe, vises det en ExclusiveLock, transaksjons-ID og ExclusiveLock for tabellen.

Unlocking the Postgres Lock Manager. Bruce Momjian

Men hva skjer hvis jeg setter inn to rader til? Og nÄ har vi tre rader i tabellen vÄr. Jeg satte inn én rad og fikk dette som resultat. Og hvis jeg setter inn to rader til, hva er merkelig med dette? Det er noe merkelig her, for jeg la til tre rader i denne tabellen, men jeg har fortsatt to rader i lÄsetabellen. Og dette er i bunn og grunn Postgres sin grunnleggende oppfÞrsel.

Mange tenker at hvis du i databasen lÄser 100 rader, sÄ vil du mÄtte opprette 100 lÄseoppfÞringer. Hvis jeg lÄser 1 000 rader pÄ en gang, sÄ trenger jeg 1 000 slike forespÞrseler. Og hvis jeg trenger Ä blokkere en million eller en milliard. Men hvis vi gjÞr det pÄ denne mÄten, vil det ikke fungere sÄ bra. Hvis du har brukt et system som oppretter lÄseoppfÞringer for hver enkelt rad, ser du at dette er vanskelig. For du mÄ umiddelbart bestemme deg for en lÄsetabell som kan vÊre overbelastet, men Postgres gjÞr det ikke slik.

Og pÄ dette lysbildet er det veldig viktig at det tydelig demonstreres at det er et annet system som fungerer innenfor MVCC, som lÄser enkeltlinjer. SÄ nÄr du lÄser milliarder av rader, oppretter ikke Postgres milliardene av separate lÄsekommandoer. Og dette har en veldig positiv innvirkning pÄ ytelsen.

Unlocking the Postgres Lock Manager. Bruce Momjian

Hva med oppdateringen? Jeg oppdaterer nÄ en rad, og du kan merke at den umiddelbart utfÞrte to forskjellige operasjoner. Den har samtidig lÄst tabellen, men den har ogsÄ lÄst indeksen. Og den mÄtte lÄse indeksen, fordi det er unike begrensninger pÄ denne tabellen. Vi vil forsikre oss om at ingen endrer det, sÄ vi lÄser det.

Unlocking the Postgres Lock Manager. Bruce Momjian

Hva skjer hvis jeg vil oppdatere to rader? Vi ser at det oppfÞrer seg pÄ samme mÄte. Vi gjÞr dobbelt sÄ mange oppdateringer, men fortsatt det samme antallet lÄste rader.

Hvis du er interessert i hvordan Postgres gjÞr dette, mÄ du hÞre pÄ mine presentasjoner om MVCC for Ä forstÄ hvordan Postgres internt merker de radene som den endrer. Og Postgres har en mÄte Ä gjÞre dette pÄ, men den gjÞr det ikke pÄ nivÄet for tabellÄs, den gjÞr det pÄ et lavere og mer effektivt nivÄ.

Unlocking the Postgres Lock Manager. Bruce Momjian

Men hvis jeg vil slette noe? Hvis jeg sletter for eksempel en rad og jeg fortsatt har de to innledende lÄsene, og selv om jeg Þnsker Ä slette dem alle, vil de fortsatt vÊre til stede.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og, for eksempel, hvis jeg Þnsker Ä sette inn 1 000 rader, og deretter slette eller legge til 1 000 rader, vil de individuelle radene jeg legger til eller endrer, ikke bli registrert her. De blir registrert pÄ et lavere nivÄ inne i selve raden. Og under presentasjonen om MVCC snakket jeg om dette i detalj. Men det er veldig viktig, nÄr du analyserer lÄser, Ä sÞrge for at du har en lÄs pÄ tabellnivÄ og at du ikke ser opptaket av individuelle rader her.

Unlocking the Postgres Lock Manager. Bruce Momjian

Hva med eksplisitt lÄsing?

Unlocking the Postgres Lock Manager. Bruce Momjian

Hvis jeg klikker 'oppdater', har jeg to lÄste rader. Og hvis jeg velger dem alle og klikker 'oppdater overalt', vil jeg fortsatt ha to lÄsede oppfÞringer.

Unlocking the Postgres Lock Manager. Bruce Momjian

Vi oppretter ikke separate oppfĂžringer for hver enkelt rad. For ellers vil ytelsen synke, det kan bli for mye av det. Og vi kan havne i en vanskelig situasjon.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og det samme gjelder hvis vi gjĂžr delt, vi kan gjĂžre det for alt 30 ganger.

Unlocking the Postgres Lock Manager. Bruce Momjian

Vi gjenoppretter tabellen vÄr, sletter alt, og deretter setter vi inn en rad pÄ nytt.

Unlocking the Postgres Lock Manager. Bruce Momjian

En annen type oppfþrsel du ser i Postgres, er den veldig kjente og þnskelige oppfþrselen – at du kan utfþre oppdatering eller selektering. Og du kan gjþre dette samtidig. Seleksjonen blokkerer ikke oppdateringen, og det samme gjelder motsatt vei. Vi sier at den som leser ikke blokkerer den som skriver, og den som skriver blokkerer ikke leseren.

Jeg vil vise deg et eksempel pĂ„ dette. Jeg skal nĂ„ gjĂžre et valg. Deretter skal vi gjĂžre en INSERT. Og da kan du se – 694. Du vil kunne se ID-en til transaksjonen som utfĂžrte denne innsettingen. Og slik fungerer det.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og hvis jeg nĂ„ ser pĂ„ min backend ID, sĂ„ har den blitt – 695.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og jeg kan se at 695 dukker opp i tabellen min.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og hvis jeg utfÞrer en oppdatering her slik, fÄr jeg en annen situasjon. I dette tilfellet er 695 en eksklusiv lÄsing, og oppdatering har det samme atferd, men det oppstÄr ikke konflikt mellom dem, noe som er ganske uvanlig.

Og du kan merke deg at pÄ toppen er det ShareLock, og nederst er det ExclusiveLock. Og begge transaksjoner ble oppnÄdd.

Og du mÄ hÞre mitt foredrag om MVCC for Ä forstÄ hvordan dette skjer. Men det er en illustrasjon pÄ at du kan gjÞre dette samtidig, dvs. bÄde utfÞre SELECT og UPDATE samtidig.

Unlocking the Postgres Lock Manager. Bruce Momjian

La oss nullstille og gjĂžre en operasjon til.

Unlocking the Postgres Lock Manager. Bruce Momjian

Hvis du prÞver Ä kjÞre to oppdateringer samtidig pÄ den samme raden, vil det bli lÄst. Og husk at jeg sa at den lesende ikke blokkerer den skrivende, men den skrivende blokkerer leseren, men én skribent blokkerer en annen skribent. Dvs. vi kan ikke ha to personer som oppdaterer den samme raden samtidig. Man mÄ vente til den ene er ferdig.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og for Ä illustrere dette vil jeg se pÄ Lockdemo-tabellen. Og vi skal se pÄ én rad. Om transaksjon 698.

Vi oppdaterte dette til 2. 699 er den fÞrste oppdateringen. Og den har gÄtt gjennom vellykket, eller sÄ er den i en ventende transaksjon og venter pÄ at vi skal bekrefte eller avbryte.

Unlocking the Postgres Lock Manager. Bruce Momjian

Men se pĂ„ noe annet – 2/51 – det er vĂ„r fĂžrste transaksjon, vĂ„r fĂžrste Ăžkt. 3/112 – det er den andre forespĂžrselen som dukket opp Ăžverst og som endret denne verdien til 3. Og hvis du ser nĂžye, sĂ„ har den Ăžverste blokkert seg selv, som er 699. Men 3/112 har ikke gitt noen blokkering. I kolonnen Lock_mode stĂ„r det at den venter. Den venter pĂ„ 699. Og hvis du ser hvor 699 er, sĂ„ er det hĂžyere oppe. Hva gjorde den fĂžrste Ăžkten? Den opprettet en eksklusiv blokkering pĂ„ sin egen transaksjons-ID. Det er slik Postgres gjĂžr det. Den blokkerer sin egen transaksjons-ID. Og hvis du vil vente til noen bekrefter eller kansellerer, mĂ„ du vente til det er en ventende transaksjon. Derfor kan vi se den merkelige linjen.

La oss se pÄ det en gang til. Til venstre ser vi vÄr behandlings-ID. I den andre kolonnen ser vi vÄr virtuelle transaksjons-ID, og i den tredje ser vi lock_type. Hva betyr dette? I bunn og grunn sier det at den blokkerer transaksjons-ID. Men merk at i alle radene nederst stÄr det relation. Og derfor har du to typer blokkeringer i tabellen. Det er blokkering av relation. Og det er ogsÄ blokkering av transactionid, hvor vi blokkerer oss selv, det er nettopp det som skjer i den fÞrste raden eller nederst, hvor transactionid vi venter pÄ at 699 skal fullfÞre sin operasjon.

Jeg ser hva som skjer her. Og det skjer to ting samtidig. Du ser pÄ blokkeringen av transaksjons-ID i den fÞrste raden, som blokkerer seg selv. Og den blokkerer seg selv for Ä fÄ folk til Ä vente.

Hvis du ser pÄ den 6. linjen, er det samme post som den fÞrste. Og derfor er transaksjon 699 blokkert. 700 blokkerer ogsÄ seg selv. Og sÄ vil du se i den nederste raden at vi venter pÄ at 699 skal fullfÞre sin operasjon.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og i lock_type, tuple ser du tallene.

Unlocking the Postgres Lock Manager. Bruce Momjian

Du kan se at det er 0/10. Og det er sidenummeret, og ogsÄ offset for den spesifikke raden.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og du ser at det blir 0/11 nÄr vi oppdaterer.

Unlocking the Postgres Lock Manager. Bruce Momjian

Men i virkeligheten er det 0/10, fordi det er venting pÄ denne operasjonen. Vi har mulighet til Ä se at dette er raden jeg venter pÄ Ä bekrefte.

Unlocking the Postgres Lock Manager. Bruce Momjian

SÄ snart vi bekreftet det og klikket pÄ commit, og nÄr oppdateringen er fullfÞrt, er dette hva vi fÄr igjen. Transaksjon 700 er den eneste lÄsen, den venter ikke lenger pÄ noen, fordi den er blitt kommittet. Den venter bare pÄ at transaksjonen skal fullfÞres. SÄ snart 699 er ferdig, venter vi ikke lenger. Og nÄ sier transaksjon 700 at alt er i orden, at alle lÄsene den trenger, er tilgjengelige i alle tillatte tabeller.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og for Ä gjÞre det enda mer komplisert, oppretter vi en annen view som denne gangen gir oss hierarkiet. Jeg forventer ikke at du skal forstÄ denne forespÞrselen. Men det vil gi oss et klarere bilde av hva som skjer.

Unlocking the Postgres Lock Manager. Bruce Momjian

Dette er en rekursiv view, som ogsÄ har en annen seksjon. Og den returnerer deretter alt sammen igjen. La oss bruke dette.

Unlocking the Postgres Lock Manager. Bruce Momjian

Hva om vi gjÞr tre samtidige oppdateringer og sier at raden nÄ er lik tre. Og vi endrer 3 til 4.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og her ser vi 4. Og transaksjons-ID 702.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og deretter endrer jeg 4 til 5. Og 5 til 6, og 6 til 7. Og jeg lager en kÞ av mennesker som venter pÄ at denne ene transaksjonen skal fullfÞres.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og alt blir forstÄelig. Hvilken er den fÞrste raden? Det er 702. Det er transaksjons-ID-en som opprinnelig satte denne verdien. Og hva stÄr det i kolonnen Granted? Jeg har merker f. Dette er mine oppdateringer, som (5, 6, 7) ikke kan godkjennes, fordi vi venter pÄ at transaksjons-ID 702 skal bli ferdig. Der har vi en lÄs pÄ transaksjons-ID-en. Og det blir 5 transaksjonslÄser ID.

Og hvis du ser pÄ 704, pÄ 705, sÄ er det fortsatt ingenting skrevet, fordi de fortsatt ikke vet hva som skjer. De skriver bare at de ikke har anelse om hva som skjer. Og de vil bare gÄ i dvale, fordi de venter pÄ at noen skal bli ferdig og vekke dem nÄr muligheten til Ä endre raden er der.

Unlocking the Postgres Lock Manager. Bruce Momjian

Slik ser det ut. Det er klart at de alle venter pÄ 12. linje.

Unlocking the Postgres Lock Manager. Bruce Momjian

Det er det vi sÄ her. Her er 0/12.

Unlocking the Postgres Lock Manager. Bruce Momjian

SÄ snart den fÞrste transaksjonen er godkjent, kan du her se hvordan hierarkiet fungerer. Og nÄ blir alt klart. De blir alle rene. Og de er faktisk fortsatt i ventemodus.

Unlocking the Postgres Lock Manager. Bruce Momjian

Dette er hva som skjer. 702 blir kommittet. NÄ fÄr 703 denne radlÄsen, og sÄ begynner 704 Ä vente pÄ at 703 skal bli kommittet. 705 venter ogsÄ pÄ dette. Og nÄr alt dette er fullfÞrt, sÄ rydder de opp selv. Jeg vil gjerne pÄpeke at alle stiller seg i kÞ. Det er veldig likt en situasjon med trafikknedgang, der alle venter pÄ den fÞrste bilen. Den fÞrste bilen stopper, og alle stiller seg i en lang rekke. SÄ beveger den seg, sÄ kan den neste bilen kjÞre frem og fÄ sin lÄs, osv.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og hvis dette ikke virket komplisert nok, sÄ skal vi nÄ snakke om deadlocks. Jeg vet ikke hvem av dere som har vÊrt borti dette. Det er et ganske vanlig problem i databaser. Men deadlocks er det tilfellet hvor én sesjon venter pÄ at en annen sesjon skal utfÞre noe. Og samtidig venter den andre sesjonen pÄ at den fÞrste sesjonen skal utfÞre noe.

For eksempel, hvis Ivan sier: «Gi meg noe», og jeg sier: «Nei, jeg gir deg dette bare hvis du gir meg noe annet». Og han sier: «Nei, jeg gir deg ikke dette hvis du ikke gir meg noe». Og vi havner i en deadlock-situasjon. Jeg er sikker pÄ at Ivan ikke ville gjort slik, men dere forstÄr meningen, at to personer vil ha noe og de er ikke villige til Ä gi det fra seg fÞr den andre personen gir dem det de Þnsker. Og der finnes det ingen lÞsning.

I bunn og grunn mÄ databasen din oppdage dette. Deretter mÄ den fjerne eller lukke en av sesjonene, fordi hvis ikke sÄ vil de forbli der for alltid. Vi ser dette i databaser, vi ser det i operativsystemer. Om hvor som helst vi har parallelle prosesser, kan dette skje.

Unlocking the Postgres Lock Manager. Bruce Momjian

NÄ skal vi sette opp to deadlocks. Vi setter 50 og 80. I den fÞrste raden vil jeg utfÞre en oppdatering fra 50 til 50. Jeg fÄr transaksjonsnummer 710.

Unlocking the Postgres Lock Manager. Bruce Momjian

Deretter skal jeg endre 80 til 81, og 50 til 51.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og slik vil det se ut. Derfor har 710 en radlÄs, mens 711 venter pÄ bekreftelse. Vi sÄ dette nÄr vi oppdaterte. 710 er eier av vÄr rad. Og 711 venter pÄ at 710 skal fullfÞre transaksjonen.

Unlocking the Postgres Lock Manager. Bruce Momjian

Det stÄr til og med skrevet hvilken rad vi har deadlocks pÄ. Og her begynner det Ä bli merkelig.

Unlocking the Postgres Lock Manager. Bruce Momjian

NĂ„ oppdaterer vi 80 til 80.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og her begynner deadlocks. 710 venter pÄ svar fra 711, mens 711 venter pÄ 710. Og dette kommer ikke til Ä ende godt. Det finnes ingen vei ut av dette. De vil vente pÄ svar fra hverandre.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og dette vil bare begynne Ă„ forsinke alt. Og det Ăžnsker vi ikke.

Unlocking the Postgres Lock Manager. Bruce Momjian

I Postgres finnes det mÄter Ä oppdage nÄr dette skjer. NÄr det skjer, fÄr du en feil som denne. Det er tydelig at en prosess venter pÄ SHARE LOCK fra en annen prosess, altsÄ som blokkeres av prosess 711. Og den prosessen ventet pÄ Ä fÄ en SHARE LOCK pÄ en spesifikk transaksjons-ID, som ble blokkert av en bestemt prosess. SÄ her er det en deadlock.

Unlocking the Postgres Lock Manager. Bruce Momjian

Er det mulig Ă„ ha treveis deadlocks? Kan dette skje? Ja.

Unlocking the Postgres Lock Manager. Bruce Momjian

Vi skriver disse tallene inn i tabellen. Vi endrer 40 til 40, vi lÄser.

Unlocking the Postgres Lock Manager. Bruce Momjian

Endrer 60 til 61, 80 til 81.

Unlocking the Postgres Lock Manager. Bruce Momjian

Deretter endrer vi 80, og sÄ - boom!

Unlocking the Postgres Lock Manager. Bruce Momjian

Og 714 venter nÄ pÄ 715. 716 venter pÄ 715. Og det er ingenting Ä gjÞre med dette.

Unlocking the Postgres Lock Manager. Bruce Momjian

Her er det ikke bare to personer, her er det tre personer. Jeg vil ha noe fra deg, den andre vil ha noe fra den tredje personen, og den tredje personen vil ha noe fra meg. Vi befinner oss i en trepartsventing, fordi vi alle venter pÄ at den andre skal fullfÞre det de mÄ gjÞre.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og Postgres vet hvilken rad dette skjer pÄ. Derfor vil det gi deg fÞlgende melding, som viser at du har et problem, hvor tre prosesser blokkerer hverandre. Og her er det ingen begrensninger. Dette kan skje i en situasjon hvor 20 poster blokkerer hverandre.

Unlocking the Postgres Lock Manager. Bruce Momjian

Neste problem er serializable.

Unlocking the Postgres Lock Manager. Bruce Momjian

Hvis det er en spesifikk serializable blokkering.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og vi gÄr tilbake til 719. Den har en helt normal utgang.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og du kan trykke for Ă„ gjĂžre en transaksjon fra serializable.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og du forstĂ„r at du nĂ„ har en annen type blokkering SA – dette betyr serializable.

Unlocking the Postgres Lock Manager. Bruce Momjian

Unlocking the Postgres Lock Manager. Bruce Momjian

Derfor har vi en ny type blokkering, kalt SARieadLock, som er en seriesperring og lar deg angi serienumre.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og du kan ogsÄ sette inn unike indekser.

Unlocking the Postgres Lock Manager. Bruce Momjian

I denne tabellen har vi unike indekser.

Unlocking the Postgres Lock Manager. Bruce Momjian

SÄ hvis jeg skriver nummer 2 her, sÄ har jeg 2. Men helt pÄ toppen setter jeg inn en annen 2. Og du kan se at 721 har en eksklusiv blokkering. Men nÄ venter 722 pÄ at 721 skal fullfÞre sin operasjon, fordi den ikke kan sette inn 2 fÞr den vet hva som skjer med 721.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og hvis vi lager en subtransaksjon.

Unlocking the Postgres Lock Manager. Bruce Momjian

Her har vi 723.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og dersom vi beholder et punkt og deretter oppdaterer det, fÄr vi en ny transaksjons-ID. Dette er en annen atferd du trenger Ä vite om. Hvis vi returnerer dette, forsvinner transaksjons-ID-en. 724 forsvinner. Men nÄ fÄr vi 725.

Og hva prĂžver jeg Ă„ gjĂžre her? Jeg prĂžver Ă„ vise deg eksempler pĂ„ uvanlige lĂ„ser som du kan finde: enten det er serializable-lĂ„ser eller SAVEPOINT – dette er forskjellige typer lĂ„ser som vil vises i lĂ„stabelen.

Unlocking the Postgres Lock Manager. Bruce Momjian

Dette er opprettelsen av eksplisitte lÄser som har pg_advisory_lock.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og du ser at lÄsetypen her er oppfÞrt som advisory. Og det stÄr skrevet med rÞdt «advisory». Og du kan samtidig lÄse det med pg_advisory_unlock.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og for Ä avslutte vil jeg vise deg enda en fantastisk ting. Jeg vil lage en annen type. Men jeg vil koble tabellen pg_locks med tabellen pg_stat_activity. Og hvorfor vil jeg gjÞre dette? Fordi det lar meg se og observere alle nÄvÊrende Þkter og se hvilke spesifikke lÄser de venter pÄ. Og det er ganske interessant nÄr vi setter sammen lÄsetabellen og forespÞrselstabellen.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og her oppretter vi pg_stat_view.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og vi oppdaterer en rad med Ă©n. Og her ser vi 724. Deretter oppdaterer vi raden vĂ„r til tre. Og hva ser du her nĂ„? Dette er forespĂžrslene, det vil si at du ser hele listen over forespĂžrslene listet i venstre kolonne. Og deretter kan du pĂ„ hĂžyre side se lĂ„ser og hva de skaper. Og dette kan vĂŠre mer forstĂ„elig for deg, slik at du ikke trenger Ă„ gĂ„ tilbake til hver Ăžkt og sjekke – om det er nĂždvendig Ă„ bli med eller ikke. Det gjĂžr de for oss.

En annen funksjon som er veldig nyttig – er pg_blocking_pids. Du har kanskje aldri hĂžrt om den. Hva gjĂžr den? Den lar oss si at for denne sesjonen 11740, hvilke spesifikke prosess-IDs den venter pĂ„. Og du kan se at 11740 venter pĂ„ 724. Og 724 er Ăžverst. Og 11306 er din prosess-ID. I bunn og grunn gĂ„r denne funksjonen gjennom lĂ„netabellen din. Jeg vet at det er litt komplisert, men du klarer Ă„ forstĂ„ det. I bunn og grunn gĂ„r denne funksjonen gjennom denne lĂ„netabellen og prĂžver Ă„ finne hvor denne prosess-IDen er, med tanke pĂ„ de lĂ„sene den venter pĂ„. Og prĂžver ogsĂ„ Ă„ beregne hvilken prosess-ID den prosessen har som venter pĂ„ lĂ„ser. SĂ„ du kan kjĂžre denne funksjonen pg_blocking_pids.

Og dette kan vÊre veldig nyttig. Vi la dette til fÞrst med versjon 9.6, sÄ denne funksjonen har bare eksistert i 5 Är, men den er veldig, veldig nyttig. Det samme gjelder den andre forespÞrselen. Den viser akkurat det vi trenger Ä se.

Unlocking the Postgres Lock Manager. Bruce Momjian

Dette er noe jeg Þnsket Ä diskutere med deg. Og som jeg forventet, brukte vi all vÄr tid, fordi det var sÄ mange lysbilder. Lysbildene er tilgjengelige for nedlasting. Jeg vil takke deg for at du var her. Jeg er sikker pÄ at du vil like resten av konferansen, tusen takk!

SpÞrsmÄl:

For eksempel, hvis jeg prÞver Ä oppdatere rader, mens den andre sesjonen prÞver Ä slette hele tabellen. SÄ langt jeg forstÄr, mÄ det vÊre noe som en intent lock. Finnes dette i Postgres?

Unlocking the Postgres Lock Manager. Bruce Momjian

La oss gÄ tilbake til begynnelsen. Kanskje du husker at nÄr du gjÞr noe som for eksempel SELECT, gir vi AccessShareLock. Og dette forhindrer sletting av tabellen. SÄ hvis du for eksempel Þnsker Ä oppdatere en rad i tabellen eller slette en rad, kan ikke noen slette hele tabellen samtidig med det, fordi du holder denne AccessShareLock over hele tabellen og over raden. Og sÄ snart du er ferdig, kan de slette det. Men sÄ lenge du endrer noe der, kan de ikke gjÞre det.

La oss prÞve igjen. La oss gÄ til eksemplet med sletting. Og du ser at det er en eksklusiv lÄs over hele tabellen pÄ raden.

Det vil se ut som en eksklusiv lÄs, ikke sant?

Ja, det ser ut som det. Jeg forstÄr hva du snakker om. Du sier at hvis jeg utfÞrer SELECT, sÄ vil jeg ha ShareExclusive, og sÄ konverterer jeg dette til Row Exclusive, blir det et problem? Men overraskende nok skaper det ikke et problem. Det er som Ä Þke lÄsen, men i bunn og grunn har jeg en lÄs som forhindrer sletting. Og nÄ, nÄr jeg gjÞr denne lÄsen sterkere, forhindrer den fortsatt sletting. SÄ det er ikke slik at jeg hever det opp. Det vil si, den forhindret det selv nÄr den var pÄ et lavere nivÄ, sÄ nÄr jeg hever nivÄet, forhindrer den fortsatt sletting av tabellen.

Jeg forstÄr hva du snakker om. Det er ikke et tilfelle av Þkt lÄsebredde, hvor du prÞver Ä slippe en lÄs for Ä innfÞre en mer kraftfull. Her heves det bare allment beskyttelsen, sÄ det skaper ikke noen konflikter. Men det er et godt spÞrsmÄl. Takk for at du stilte det!

Hva mÄ vi gjÞre for Ä unngÄ en deadlock-situasjon nÄr vi har mange Þkter og mange brukere?

Postgres oppdager automatisk situasjoner med deadlocks. Og vil automatisk fjerne en av Ăžktene. Den eneste mĂ„ten Ă„ unngĂ„ deadlocks pĂ„ er Ă„ lĂ„se folk i samme rekkefĂžlge. SĂ„ nĂ„r du ser pĂ„ applikasjonen din, er Ă„rsaken til deadlocks ofte... La oss si at jeg Ăžnsker Ă„ lĂ„se to forskjellige ting. Én applikasjon lĂ„ser tabell 1, mens en annen applikasjon lĂ„ser 2, og deretter tabell 1. Den enkleste mĂ„ten Ă„ unngĂ„ deadlocks pĂ„ er Ă„ se pĂ„ applikasjonen din og sĂžrge for at lĂ„sene skjer i den samme rekkefĂžlgen i alle applikasjoner. Og dette fjerner som regel 80 % av problemene, fordi mange forskjellige folk skriver disse applikasjonene. Og hvis du lĂ„ser dem i samme rekkefĂžlge, vil du ikke stĂ„ overfor en deadlock-situasjon.

Takk for presentasjonen! Du snakket om vacuum full, og hvis jeg forstÄr det riktig, sÄ deformerer vacuum full rekkefÞlgen av oppfÞringer i den enkelte lagringen, sÄ de nÄvÊrende oppfÞringene forblir uendret. Men hvorfor tar vacuum full en eksklusiv lÄs, og hvorfor er det konflikt med skriveoperasjoner?

Dette er et godt spĂžrsmĂ„l. Årsaken er at vacuum full tar tabellen. Og vi lager i hovedsak en ny versjon av tabellen. SĂ„ tabellen blir ny. Det ender med at dette vil vĂŠre en helt ny versjon av tabellen. Problemet er at nĂ„r vi gjĂžr dette, Ăžnsker vi ikke at folk skal lese den, fordi vi trenger dem til Ă„ se den nye tabellen. Og derfor henger dette sammen med det forrige spĂžrsmĂ„let. Hvis vi kunne lese samtidig, ville vi ikke vĂŠrt i stand til Ă„ flytte den og lede folk til den nye tabellen. Vi mĂ„tte ha ventet til alle var ferdige med Ă„ lese denne tabellen, og derfor er dette i hovedsak en eksklusiv lĂ„sesituasjon.
Vi sier bare at vi lÄser fra begynnelsen av, fordi vi vet at vi pÄ slutten vil trenge en eksklusiv lÄs for Ä flytte alle til den nye kopien. SÄ potensielt kan vi tillate dette. Og vi gjÞr dette med samtidige indeksering. Men det er mye mer komplisert. Og det relaterer seg sterkt til ditt forrige spÞrsmÄl om eksklusiv lÄs.

Er det mulig Ä legge til locking timeout i Postgres? I Oracle kan jeg for eksempel skrive «velg for oppdatering» og vente 50 sekunder fÞr oppdateringen. Dette var bra for applikasjonen. Men i Postgres mÄ jeg enten gjÞre det umiddelbart uten venting, eller vente til et visst tidspunkt.

Ja, du kan velge timeout for lÄsene dine. Du kan ogsÄ gi kommandoen no way, som vil..., hvis du ikke kan fÄ lÄsen med en gang. SÄ enten lock timeout eller noe annet som lar deg gjÞre dette. Dette gjÞres ikke pÄ syntaktisk nivÄ. Dette gjÞres som en variabel pÄ serveren. Noen ganger kan dette ikke brukes.

Kan du Äpne 75. lysbildet?

Ja.

Unlocking the Postgres Lock Manager. Bruce Momjian

Og mitt spÞrsmÄl er dette. Hvorfor venter begge oppdateringsprosessene pÄ 703?

Og dette er et utmerket spÞrsmÄl. Jeg forstÄr forresten ikke hvorfor Postgres gjÞr dette. Men nÄr 703 ble opprettet, forventet den 702. Og nÄr 704 og 705 dukker opp, ser det ut som om de ikke vet hva de venter pÄ, fordi det ikke er noe der ennÄ. Og Postgres hÄndterer det slik: nÄr du ikke kan fÄ en lÄs, spÞr den «Hva er poenget med Ä behandle deg?», fordi du allerede venter pÄ noen. SÄ vi lar det henge i luften, den oppdaterer det ikke i det hele tatt. Men hva skjedde her? SÄ snart 702 fullfÞrte prosessen og 703 fikk sin lÄs, kom systemet tilbake. Og sa at nÄ har vi to personer som venter. La oss oppdatere dem sammen. Og indikere at begge venter.

Jeg vet ikke hvorfor Postgres gjÞr slik. Men det er et problem som kalles f
. Jeg mener, dette er ikke et begrep pÄ russisk. Det er nÄr alle venter pÄ én lÄs, selv om det er 20 instanser som venter pÄ lÄsen. Og plutselig vÄkner de alle opp samtidig. Og alle begynner Ä prÞve Ä reagere. Men systemet sÞrger for at alle venter pÄ 703. Fordi de alle venter, stiller vi dem umiddelbart i kÞ. Og hvis det dukker opp noen andre nye forespÞrsel, som ble dannet etter dette, for eksempel 707, sÄ vil det igjen vÊre tomt.

Og jeg mener at dette gjÞres for Ä kunne si at pÄ dette stadiet venter 702 pÄ 703, og alle som kommer etter dette, vil ikke ha noen post i dette feltet. Men sÄ snart den fÞrste som venter forlater, fÄr alle som ventet i det Þyeblikket fÞr oppdateringen den samme markÞren. Og derfor mener jeg det er gjort slik at vi kan hÄndtere dem i rekkefÞlge, slik at de er riktig ordnet.

Jeg har alltid sett pÄ dette som et ganske merkelig fenomen. Fordi her, for eksempel, ikke oppregnes dem i det hele tatt. Men jeg mener at hver gang vi gir en ny lÄs, ser vi pÄ alle som er i venteprosessen. SÄ stiller vi dem i kÞ. Og sÄ vil enhver ny som kommer, komme i kÞ kun nÄr den neste personen er ferdig med Ä bli behandlet. Veldig godt spÞrsmÄl. Tusen takk for spÞrsmÄlet!

Jeg mener det er mye mer logisk nÄr 705 venter pÄ 704.

Men problemet her er som fÞlger. Teknisk kan du vekke enten den ene eller den andre. Og derfor vil vi vekke den ene eller den andre. Men hva skjer i driften av systemet? Du ser hvordan 703 pÄ toppen har blokkert sin egen transaksjons-ID. Slik fungerer Postgres. Og 703 blir blokkert av sin egen transaksjons-ID, sÄ hvis noen Þnsker Ä vente, vil de vente pÄ 703. Og i realiteten fullfÞrer 703. Og fÞrst etter at den er fullfÞrt, vil en av prosessene bli vekket. Og vi vet ikke hvilken av prosessene det vil vÊre. Deretter behandler vi dem gradvis. Men det er ikke klart hvilken prosess som vÄkner fÞrst, fordi det kan vÊre hvilken som helst av disse prosessene. I utgangspunktet hadde vi en planlegger som sa at vi nÄ kan vekke hvilken som helst av disse prosessene. Vi velger bare én tilfeldig. SÄ begge mÄ merkes, fordi vi kan vekke en av dem.

Og problemet er at vi har CP-uendelighet. Og derfor er det ganske sannsynlig at vi kan vekke den senere. Og hvis vi for eksempel vekker den senere, vil vi vente pÄ den som akkurat har fÄtt blokkering, sÄ vi kan ikke bestemme hvem som vil bli vekket fÞrst. Vi skaper bare en slik situasjon, og systemet vil vekke dem i vilkÄrlig rekkefÞlge.

Ja artikler om lÄser av Egor Rogov. Ta en titt, de er ogsÄ interessante og nyttige. Temaet er selvfÞlgelig grusomt komplisert. Tusen takk, Bruce!

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster