LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Transkription av Bruce Momjians föredrag 2020 "LÄsa upp Postgres Lock Manager".

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

(Obs: Alla SQL-frÄgor frÄn bilderna kan erhÄllas frÄn denna lÀnk: http://momjian.us/main/writings/pgsql/locking.sql)

HallÄ! Det Àr fantastiskt att vara hÀr i Ryssland igen. Jag Àr ledsen att jag inte kunde komma förra Äret, men i Är har Ivan och jag stora planer. Jag hoppas kunna vara hÀr mycket oftare. Jag Àlskar att komma till Ryssland. Jag kommer att besöka Tyumen, Tver. Jag Àr vÀldigt glad att jag kommer att kunna besöka dessa stÀder.

Jag heter Bruce Momjian. Jag arbetar pÄ EnterpriseDB och har arbetat med Postgres i över 23 Är. Jag bor i Philadelphia, USA. Jag reser ungefÀr 90 dagar om Äret. Och jag deltar i ett 40-tal konferenser. Min Hemsida, som innehÄller bilderna som jag nu ska visa dig. DÀrför kan du efter konferensen ladda ner dem frÄn min personliga hemsida. Den innehÄller ocksÄ ett 30-tal presentationer. Det finns ocksÄ videor och ett stort antal blogginlÀgg, mer Àn 500. Detta Àr en ganska informativ resurs. Och om du Àr intresserad av detta material, dÄ inbjuder jag dig att anvÀnda det.

Jag brukade vara lÀrare, professor innan jag började arbeta med Postgres. Och jag Àr vÀldigt glad att jag nu ska kunna berÀtta vad jag ska berÀtta för dig. Det hÀr Àr en av mina mest intressanta presentationer. Och den hÀr presentationen innehÄller 110 bilder. Vi kommer att börja prata med enkla saker, och mot slutet kommer rapporten att bli mer och mer komplex och bli ganska komplex.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Det hÀr Àr ett ganska obehagligt samtal. Blockering Àr inte det mest populÀra Àmnet. Vi vill att det hÀr ska försvinna nÄgonstans. Det Àr som att gÄ till tandlÀkaren.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

  1. LÄsning Àr ett problem för mÄnga mÀnniskor som arbetar i databaser och har flera processer igÄng samtidigt. De behöver blockering. Det vill sÀga, idag ska jag ge dig grundlÀggande kunskaper om blockering.
  2. Transaktions-ID:n. Detta Àr en ganska trÄkig del av presentationen, men de mÄste förstÄs.
  3. DÀrefter kommer vi att prata om typer av blockering. Detta Àr en ganska mekanisk del.
  4. Och nedan kommer vi att ge nÄgra exempel pÄ blockering. Och det kommer att vara ganska svÄrt att förstÄ.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

LĂ„t oss prata om blockering.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

VÄr terminologi Àr ganska komplex. Hur mÄnga av er vet var detta avsnitt kommer ifrÄn? TvÄ personer. Det hÀr Àr frÄn ett spel som heter Colossal Cave Adventure. Det var ett textbaserat datorspel pÄ 80-talet tror jag. DÀr fick man gÄ in i en grotta, in i en labyrint, och texten Àndrades, men innehÄllet var ungefÀr detsamma varje gÄng. Det Àr sÄ jag minns det hÀr spelet.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och hÀr ser vi namnet pÄ lÄsen som kom till oss frÄn Oracle. Vi anvÀnder dem.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

HÀr ser vi termer som förvirrar mig. Till exempel, DELA UPPDATERING ECXLUSIVE. NÀsta DELA RAW ECXLUSIVE. För att vara Àrlig Àr dessa namn inte sÀrskilt tydliga. Vi kommer att försöka övervÀga dem mer i detalj. Vissa innehÄller ordet "dela", vilket betyder att separera. Vissa innehÄller ordet "exklusiv". Vissa innehÄller bÄda dessa ord. Jag skulle vilja börja med hur dessa lÄs fungerar.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och ordet "tillgÄng" Àr ocksÄ mycket viktigt. Och orden "rad" Àr en strÀng. Det vill sÀga Ätkomstfördelning, radfördelning.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

En annan frÄga som mÄste förstÄs i Postgres, som jag tyvÀrr inte kommer att kunna ta upp i mitt föredrag, Àr MVCC. Jag har en separat presentation om detta Àmne pÄ min hemsida. Och om du tycker att den hÀr presentationen Àr svÄr sÄ Àr MVCC förmodligen min svÄraste. Och om du Àr intresserad kan du se den pÄ hemsidan. Du kan titta pÄ videon.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

En annan sak vi behöver förstÄ Àr transaktions-ID:n. MÄnga transaktioner kan inte fungera utan unika identifierare. Och hÀr har vi en förklaring av vad en transaktion Àr. Postgres har tvÄ transaktionsnummersystem. Jag vet att detta inte Àr en sÀrskilt snygg lösning.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

TÀnk ocksÄ pÄ att bilderna kommer att vara ganska svÄra att förstÄ, sÄ det som Àr markerat i rött Àr det du behöver vara uppmÀrksam pÄ.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

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

LÄt oss se. Transaktionsnumret Àr markerat i rött. Funktionen SELECT pg_back visas hÀr. Det returnerar min transaktion och transaktions-ID.

En sak till, om du gillar den hÀr presentationen och vill köra den pÄ din databas, sÄ kan du gÄ till den hÀr lÀnken i rosa och ladda ner SQL för denna presentation. Och du kan helt enkelt köra den i din PSQL och hela presentationen kommer direkt pÄ din skÀrm. Den kommer inte att innehÄlla blommor, men vi kan Ätminstone se den.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

I det hÀr fallet ser vi transaktions-ID. Det hÀr Àr numret vi tilldelade henne. Och det finns en annan typ av transaktions-ID i Postgres, som kallas virtuellt transaktions-ID

Och vi mÄste förstÄ detta. Detta Àr vÀldigt viktigt, annars kommer vi inte att kunna förstÄ lÄsning i Postgres.

Ett virtuellt transaktions-ID Àr ett transaktions-ID som inte innehÄller bestÀndiga vÀrden. Till exempel, om jag kör ett SELECT-kommando, sÄ kommer jag troligen inte att Àndra databasen, jag kommer inte att lÄsa nÄgonting. SÄ nÀr vi kör en enkel SELECT ger vi inte transaktionen ett bestÀndigt ID. Vi ger henne bara ett virtuellt ID dÀr.

Och detta förbÀttrar Postgres prestanda, förbÀttrar rensningsmöjligheterna, sÄ det virtuella transaktions-ID:t bestÄr av tvÄ siffror. Det första numret före snedstrecket Àr backend-ID:t. Och till höger ser vi bara en rÀknare.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

DÀrför, om jag kör en begÀran, stÄr det att backend-ID Àr 2.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och om jag kör en serie sÄdana transaktioner sÄ ser vi att rÀknaren ökar varje gÄng jag kör en frÄga. Till exempel, nÀr jag kör frÄgan 2/10, 2/11, 2/12, etc.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

TĂ€nk pĂ„ att det finns tvĂ„ kolumner hĂ€r. Till vĂ€nster ser vi det virtuella transaktions-ID – 2/12. Och till höger har vi ett permanent transaktions-ID. Och det hĂ€r fĂ€ltet Ă€r tomt. Och denna transaktion Ă€ndrar inte databasen. SĂ„ jag ger det inte ett permanent transaktions-ID.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

SÄ snart jag kör analyskommandot ((ANALYSE)), ger samma frÄga mig ett permanent transaktions-ID. Se hur detta har förÀndrats för oss. Jag hade inte detta ID förut, men nu har jag det.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

SÄ hÀr Àr en annan begÀran, en annan transaktion. Det virtuella transaktionsnumret Àr 2/13. Och om jag ber om ett bestÀndigt transaktions-ID kommer jag att fÄ det nÀr jag kör frÄgan.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

AlltsÄ en gÄng till. Vi har ett virtuellt transaktions-ID och ett bestÀndigt transaktions-ID. FörstÄ bara denna punkt för att förstÄ Postgres beteende.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vi gÄr vidare till det tredje avsnittet. HÀr kommer vi helt enkelt att gÄ igenom de olika typerna av lÄs i Postgres. Det Àr inte sÀrskilt intressant. Det sista avsnittet kommer att bli mycket mer intressant. Men vi mÄste övervÀga de grundlÀggande sakerna, för annars förstÄr vi inte vad som kommer att hÀnda hÀrnÀst.

Vi gÄr igenom det hÀr avsnittet, vi kommer att titta pÄ varje typ av lÄs. Och jag ska visa dig exempel pÄ hur de Àr installerade, hur de fungerar, jag ska visa dig nÄgra frÄgor som du kan anvÀnda för att se hur lÄsning fungerar i Postgres.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

För att skapa en frÄga och se vad som hÀnder i Postgres mÄste vi skicka frÄgan i systemvyn. I det hÀr fallet Àr pg_lock markerat i rött. Pg_lock Àr en systemtabell som talar om för oss vilka lÄs som för nÀrvarande anvÀnds i Postgres.

Det Àr dock vÀldigt svÄrt för mig att visa dig pg_lock i sig eftersom det Àr ganska komplext. SÄ jag skapade en vy som visar pg_locks. Och det gör ocksÄ en del arbete för mig som gör att jag kan förstÄ bÀttre. Det vill sÀga, det utesluter mina lÄs, min egen session etc. Det Àr bara standard SQL och det lÄter dig bÀttre visa dig vad som hÀnder.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Ett annat problem Àr att den hÀr vyn Àr vÀldigt bred, sÄ jag mÄste skapa en andra - lockview2.

LÄser upp Postgres Lock Manager. Bruce Momjian Och det visar mig fler kolumner frÄn tabellen. Och en till som visar mig resten av kolumnerna. Det hÀr Àr ganska komplicerat, sÄ jag försökte presentera det sÄ enkelt som möjligt.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

SÄ vi skapade en tabell som heter Lockdemo. Och vi skapade en rad dÀr. Detta Àr vÄr exempeltabell. Och vi kommer att skapa avsnitt bara för att visa dig exempel pÄ lÄs.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

AlltsÄ en rad, en kolumn. Den första typen av lÄs kallas ACCESS SHARE. Detta Àr den minst restriktiva blockeringen. Detta innebÀr att det praktiskt taget inte kommer i konflikt med andra lÄs.

Och om vi uttryckligen vill definiera ett lÄs, kör vi kommandot "lÄstabell". Och det kommer uppenbarligen att blockera, det vill sÀga i ACCESS SHARE-lÀge startar vi lÄstabellen. Och om jag kör PSQL i bakgrunden, sÄ startar jag den andra sessionen frÄn min första session pÄ detta sÀtt. Det vill sÀga, vad ska jag göra hÀr? Jag gÄr till en annan session och sÀger till den "visa mig lÄsvyn för denna begÀran." Och hÀr har jag AccessShareLock i den hÀr tabellen. Detta Àr precis vad jag begÀrde. Och han sÀger att blocket Àr tilldelat. VÀldigt enkelt.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vidare, om vi tittar pÄ den andra kolumnen, sÄ finns det ingenting dÀr. De Àr tomma.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och om jag kör kommandot "SELECT" sÄ Àr detta det implicita (explicita) sÀttet att begÀra AccessShareLock. SÄ jag slÀpper min tabell och kör frÄgan och frÄgan returnerar flera rader. Och i en av raderna ser vi AccessShareLock. SÄledes anropar SELECT AccessShareLock pÄ bordet. Och det kommer inte i konflikt med praktiskt taget nÄgonting eftersom det Àr ett lÄgnivÄlÄs.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vad hÀnder om jag kör en SELECT och har tre olika tabeller? Tidigare körde jag bara en tabell, nu kör jag tre: pg_class, pg_namespace och pg_attribute.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och nu nÀr jag tittar pÄ frÄgan ser jag 9 AccessShareLocks i tre tabeller. Varför? Tre tabeller Àr markerade i blÄtt: pg_attribute, pg_class, pg_namespace. Men du kan ocksÄ se att alla index som definieras genom dessa tabeller ocksÄ har AccessShareLock.

Och det hÀr Àr ett lÄs som praktiskt taget inte kommer i konflikt med andra. Och allt det gör Àr att helt enkelt hindra oss frÄn att nollstÀlla tabellen medan vi vÀljer den. Det Àr vettigt. Det vill sÀga, om vi vÀljer en tabell försvinner den i det ögonblicket, dÄ Àr detta fel, sÄ AccessShare Àr ett lÄgnivÄlÄs som sÀger till oss "slÀpp inte det hÀr bordet medan jag jobbar". I grund och botten Àr det allt hon gör.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

RADDELNING - Det hÀr lÄset Àr lite annorlunda.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

LÄt oss ta ett exempel. SELECT ROW SHARE metod för att lÄsa varje rad individuellt. PÄ sÄ sÀtt kan ingen radera dem eller Àndra dem medan vi tittar pÄ dem.

LÄser upp Postgres Lock Manager. Bruce MomjianSÄ vad gör SHARE LOCK? Vi ser att transaktions-ID Àr 681 för SELECT. Och det hÀr Àr intressant. Vad hÀnde hÀr? Första gÄngen vi ser numret Àr i fÀltet "LÄs". Vi tar transaktions-ID:t och det stÄr att det blockerar det i exklusivt lÀge. Allt det gör Àr att det stÄr att jag har en rad som tekniskt sett Àr lÄst nÄgonstans i tabellen. Men han sÀger inte exakt var. Vi ska titta pÄ detta mer i detalj lite senare.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

HÀr sÀger vi att lÄset anvÀnds av oss.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

SÄ ett exklusivt lÄs sÀger uttryckligen att det Àr exklusivt. Och Àven om du tar bort en rad i den hÀr tabellen, sÄ Àr detta vad som kommer att hÀnda, som du kan se.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

SHARE EXCLUSIVE Àr ett lÀngre lÄs.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Detta Àr (ANALYSE) analysatorkommandot som kommer att anvÀndas.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

DELA LÅS – du kan explicit lĂ„sa i delningslĂ€ge.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Du kan ocksĂ„ skapa ett unikt index. Och dĂ€r kan du se SHARE LOCK, som Ă€r en del av dem. Och den lĂ„ser bordet och sĂ€tter ett DELÅS pĂ„ det.

Som standard betyder DELA LÅS pĂ„ ett bord att andra personer kan lĂ€sa tabellen, men ingen kan Ă€ndra den. Och det Ă€r precis vad som hĂ€nder nĂ€r du skapar ett unikt index.

Om jag skapar ett unikt samtidigt index kommer jag att ha en annan typ av lÄsning eftersom, som ni minns, att anvÀnda samtidigt index minskar lÄsningskravet. Och om jag anvÀnder ett normalt lÄs, ett normalt index, sÄ kommer jag dÀrmed att förhindra att skriva till tabellindexet medan det skapas. Om jag anvÀnder ett index samtidigt mÄste jag anvÀnda en annan typ av lÄsning.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

DELA RAD EXKLUSIVT – Ă„terigen kan den stĂ€llas in explicit (exkl. explicit).

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Eller sÄ kan vi skapa en regel, d.v.s. ta ett specifikt fall dÀr den kommer att anvÀndas.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

EXKLUSIV lÄsning gör att ingen annan kan byta bord.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

HÀr ser vi olika typer av lÄs.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

ACCESS EXCLUSIVE Àr till exempel ett blockeringskommando. Till exempel om du gör det CLUSTER table, dÄ kommer detta att innebÀra att ingen kommer att kunna skriva dÀr. Och det lÄser inte bara sjÀlva tabellen, utan Àven indexen.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Detta Àr den andra sidan av ACCESS EXCLUSIVE-blockeringen, dÀr vi ser exakt vad den blockerar i tabellen. Den lÄser enskilda bordsrader, vilket Àr ganska intressant.

Det var all grundlÀggande information jag ville ge. Vi pratade om lÄs, om transaktions-ID, vi pratade om virtuella transaktions-ID, om permanenta transaktions-ID.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och nu ska vi gÄ igenom nÄgra blockerande exempel. Detta Àr den mest intressanta delen. Vi kommer att titta pÄ mycket intressanta fall. Och mitt mÄl i den hÀr presentationen Àr att ge dig en bÀttre förstÄelse för vad Postgres faktiskt gör nÀr den försöker blockera vissa saker. Jag tror att han Àr vÀldigt bra pÄ att blockera delar.

LÄt oss titta pÄ nÄgra specifika exempel.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vi börjar med tabeller och en rad i en tabell. NÀr jag sÀtter in nÄgot visas ExclusiveLock, Transaction ID och ExclusiveLock pÄ bordet.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vad hÀnder om jag infogar tvÄ rader till? Och nu har vÄrt bord tre rader. Och jag satte in en rad och fick detta som en utgÄng. Och om jag sÀtter in tvÄ rader till, vad Àr det för konstigt med det? Det Àr en konstig sak hÀr eftersom jag har lagt till tre rader till den hÀr tabellen, men jag har fortfarande tvÄ rader i lÄstabellen. Och detta Àr i grunden det grundlÀggande beteendet hos Postgres.

MÄnga tror att om du lÄser 100 rader i en databas, mÄste du skapa 100 lÄsposter. Om jag blockerar 1 000 rader pÄ en gÄng kommer jag att behöva 1 000 sÄdana frÄgor. Och om jag behöver en miljon eller en miljard för att blockera. Men om vi gör det hÀr kommer det inte att fungera sÀrskilt bra. Om du har anvÀnt ett system som skapar blockeringsposter för varje enskild rad, dÄ kan du se att detta Àr komplicerat. För du mÄste omedelbart definiera en lÄstabell som kan svÀmma över, men det gör inte Postgres.

Och det som verkligen Àr viktigt med den hÀr bilden Àr att den tydligt visar att det finns ett annat system som körs inuti MVCC som lÄser enskilda rader. SÄ nÀr du lÄser miljarder rader skapar Postgres inte en miljard separata lÄskommandon. Och detta har en mycket god effekt pÄ produktiviteten.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vad sÀgs om en uppdatering? Jag uppdaterar raden nu och du kan se att den har utfört tvÄ olika operationer samtidigt. Det lÄste bordet samtidigt, men det lÄste ocksÄ indexet. Och han behövde lÄsa indexet eftersom det finns unika begrÀnsningar pÄ den hÀr tabellen. Och vi vill se till att ingen Àndrar det, sÄ vi blockerar det.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vad hÀnder om jag vill uppdatera tvÄ rader? Och vi ser att han beter sig pÄ samma sÀtt. Vi gör dubbelt sÄ mÄnga uppdateringar, men exakt lika mÄnga lÄslinjer.

Om du undrar hur Postgres gör detta, mÄste du lyssna pÄ mina föredrag om MVCC för att lÀra dig hur Postgres internt markerar dessa rader att det förÀndras. Och Postgres har ett sÀtt att göra detta pÄ, men det gör det inte pÄ bordslÄsningsnivÄn, det gör det pÄ en lÀgre och mer effektiv nivÄ.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vad hÀnder om jag vill radera nÄgot? Om jag tar bort till exempel en rad och jag har kvar mina tvÄ blockerande ingÄngar, och Àven om jag vill ta bort alla sÄ finns de kvar.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och, till exempel, jag vill infoga 1 000 rader, och sedan antingen ta bort eller lÀgga till 1 000 rader, sedan de enskilda raderna som jag lÀgger till eller Àndrar, de registreras inte hÀr. De Àr skrivna pÄ en lÀgre nivÄ inom sjÀlva serien. Och under MVCC-talet talade jag om detta i detalj. Men det Àr vÀldigt viktigt nÀr du analyserar lÄs att se till att du lÄser pÄ tabellnivÄ och att du inte ser hur enskilda rader registreras hÀr.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vad sÀgs om explicit blockering?

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Om jag klickar pÄ uppdatera har jag tvÄ rader lÄsta. Och om jag vÀljer dem alla och klickar pÄ "uppdatera överallt", sÄ har jag fortfarande tvÄ blockeringsposter.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vi skapar inte separata poster för varje enskild rad. För dÄ sjunker produktiviteten, det kan bli för mycket av det. Och vi kan hamna i en obehaglig situation.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och samma sak, om vi delat kan vi göra allt 30 gÄnger.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vi ÄterstÀller vÄr tabell, tar bort allt och sÀtter sedan in en rad igen.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Ett annat beteende som du ser i Postgres som Àr mycket vÀlkÀnt och önskat beteende Àr att du kan göra en uppdatering eller ett urval. Och du kan göra detta samtidigt. Och select blockerar inte uppdatering och samma sak i motsatt riktning. Vi sÀger Ät lÀsaren att inte blockera författaren, och författaren blockerade inte lÀsaren.

Jag ska visa dig ett exempel pÄ detta. Jag kommer att göra ett val nu. Vi kommer sedan att göra INSERT. Och dÄ kan du se - 694. Du kan se ID:t för transaktionen som utförde denna infogning. Och det Àr sÄ det fungerar.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och om jag tittar pÄ mitt backend-ID nu Àr det nu 695.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och jag kan se 695 dyka upp i min tabell.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och om jag uppdaterar hÀr sÄ hÀr sÄ fÄr jag ett annat fall. I det hÀr fallet Àr 695 ett exklusivt lÄs, och uppdateringen har samma beteende, men det finns ingen konflikt mellan dem, vilket Àr ganska ovanligt.

Och du kan se att det lÀngst upp Àr ShareLock, och lÀngst ner Àr det ExclusiveLock. Och bÄda transaktionerna fungerade.

Och du mÄste lyssna pÄ mitt föredrag pÄ MVCC för att förstÄ hur detta hÀnder. Men det hÀr Àr en illustration av att du kan göra det samtidigt, dvs göra en SELECT och en UPDATE samtidigt.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

LÄt oss ÄterstÀlla och göra en operation till.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Om du försöker köra tvÄ uppdateringar samtidigt pÄ samma rad kommer det att blockeras. Och kom ihÄg att jag sa att lÀsaren inte blockerar författaren, och författaren blockerar inte lÀsaren, men en författare blockerar en annan författare. Det vill sÀga, vi kan inte lÄta tvÄ personer uppdatera samma rad samtidigt. Du mÄste vÀnta tills en av dem Àr klar.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och för att illustrera detta ska jag titta pÄ Lockdemo-tabellen. Och vi ska titta pÄ en rad. Per transaktion 698.

Vi har uppdaterat detta till 2. 699 Àr den första uppdateringen. Och den lyckades eller sÄ Àr den i en vÀntande transaktion och vÀntar pÄ att vi ska bekrÀfta eller avbryta.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Men titta pÄ nÄgot annat - 2/51 Àr vÄr första transaktion, vÄr första session. 3/112 Àr den andra begÀran som kom frÄn toppen som Àndrade det vÀrdet till 3. Och om du mÀrker sÄ lÄste den översta sig sjÀlv, vilket Àr 699. Men 3/112 beviljade inte lÄset. Kolumnen Lock_mode sÀger vad den vÀntar pÄ. Den förvÀntar sig 699. Och om man tittar pÄ var 699 Àr sÄ Àr den högre. Och vad gjorde den första sessionen? Hon skapade ett exklusivt lÄs pÄ sitt eget transaktions-ID. SÄ hÀr gör Postgres. Den blockerar sitt eget transaktions-ID. Och om du vill vÀnta pÄ att nÄgon ska bekrÀfta eller avbryta, mÄste du vÀnta medan det finns en vÀntande transaktion. Och det Àr dÀrför vi kan se en konstig linje.

LÄt oss titta igen. Till vÀnster ser vi vÄrt bearbetnings-ID. I den andra kolumnen ser vi vÄrt virtuella transaktions-ID och i den tredje ser vi lock_type. Vad betyder det hÀr? Det som stÄr Àr i huvudsak att det blockerar transaktions-ID:t. Men lÀgg mÀrke till att alla rader lÀngst ner sÀger relation. Och sÄ har du tvÄ typer av lÄs pÄ bordet. Det finns ett relationslÄs. Och sÄ finns det transaktions-id-blockeringen, dÀr du blockerar pÄ egen hand, vilket Àr exakt vad som hÀnder pÄ första raden eller lÀngst ner, dÀr transaktions-id Àr, dÀr vi vÀntar pÄ att 699 ska avsluta sin operation.

Jag fÄr se vad som hÀnder hÀr. Och hÀr hÀnder tvÄ saker samtidigt. Du tittar pÄ ett transaktions-ID-lÄs i den första raden som lÄser sig sjÀlv. Och hon blockerar sig sjÀlv för att fÄ folk att vÀnta.

Om du tittar pÄ den 6:e raden Àr det samma post som den första. Och dÀrför Àr transaktion 699 blockerad. 700 Àr ocksÄ sjÀlvlÄsande. Och sedan pÄ den nedre raden ser du att vi vÀntar pÄ att 699 ska avsluta sin operation.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och i lock_type, tuple ser du siffror.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Du kan se att det Àr 0/10. Och detta Àr sidnumret, och Àven förskjutningen för just denna rad.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och du ser att det blir 0/11 nÀr vi uppdaterar.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Men i verkligheten Àr det 0/10, eftersom det finns en vÀntan pÄ denna operation. Vi har möjlighet att se att det hÀr Àr serien som jag vÀntar pÄ att fÄ bekrÀftat.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

NÀr vi har bekrÀftat det och tryckt pÄ commit, och nÀr uppdateringen Àr klar, Àr detta vad vi fÄr igen. Transaktion 700 Àr det enda lÄset, det vÀntar inte pÄ nÄgon annan eftersom det har begÄtts. Den vÀntar helt enkelt pÄ att transaktionen ska slutföras. NÀr 699 tar slut vÀntar vi inte pÄ nÄgot lÀngre. Och nu sÀger transaktion 700 att allt Àr bra, att den har alla lÄs den behöver pÄ alla tillÄtna bord.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och för att göra det hela Ànnu mer komplicerat skapar vi en annan vy, som denna gÄng kommer att ge oss en hierarki. Jag förvÀntar mig inte att du förstÄr denna begÀran. Men detta kommer att ge oss en tydligare bild av vad som hÀnder.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Detta Àr en rekursiv syn som ocksÄ har ett annat avsnitt. Och sedan för den samman allt igen. LÄt oss anvÀnda det hÀr.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

TÀnk om vi gör tre samtidiga uppdateringar och sÀger att raden nu Àr tre. Och vi Àndrar 3 till 4.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och hÀr ser vi 4. Och transaktions-ID 702.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och sedan Àndrar jag 4 till 5. Och 5 till 6 och 6 till 7. Och jag kommer att stÀlla upp ett antal personer som kommer att vÀnta pÄ att den hÀr transaktionen ska avslutas.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och allt blir klart. Vad Àr den första raden? Detta Àr 702. Detta Àr transaktions-ID som ursprungligen satte detta vÀrde. Vad stÄr det i min Granted-kolumn? Jag har mÀrken f. Det hÀr Àr mina uppdateringar som (5, 6, 7) inte kan godkÀnnas eftersom vi vÀntar pÄ att transaktions-ID 702 ska avslutas. DÀr har vi blockering av transaktions-ID. Och detta resulterar i 5 transaktions-ID-lÄs.

Och om du tittar pÄ 704, pÄ 705, har ingenting skrivits dÀr Ànnu, eftersom de inte vet vad som hÀnder Ànnu. De skriver helt enkelt att de inte har en aning om vad som hÀnder. Och de kommer bara att lÀgga sig för att de vÀntar pÄ att nÄgon ska sluta och bli vÀckt nÀr det finns möjlighet att byta rad.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

SÄ hÀr ser det ut. Det Àr tydligt att de alla vÀntar pÄ den 12:e raden.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Det hÀr Àr vad vi sÄg hÀr. HÀr Àr 0/12.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

SÄ nÀr den första transaktionen Àr godkÀnd kan du hÀr se hur hierarkin fungerar. Och nu blir allt klart. De blir alla rena. Och de vÀntar faktiskt fortfarande.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

HÀr Àr vad som hÀnder. 702 begÄr. Och nu fÄr 703 det hÀr radlÄset, och sedan börjar 704 vÀnta pÄ att 703 ska begÄs. Och 705:an vÀntar pÄ detta ocksÄ. Och nÀr allt detta Àr klart stÀdar de upp sig. Och jag vill poÀngtera att alla stÀller upp. Och det hÀr Àr vÀldigt likt en situation i en bilkö nÀr alla vÀntar pÄ den första bilen. Den första bilen stannar och alla stÀller sig i en lÄng rad. Sedan rör den pÄ sig, dÄ kan nÀsta bil köra fram och fÄ sitt block osv.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och om detta inte verkade komplicerat nog för dig, sÄ ska vi nu prata med dig om dödlÀgen. Jag vet inte vem av er som har stött pÄ dem. Detta Àr ett ganska vanligt problem i databassystem. Men dödlÀgen Àr nÀr en session vÀntar pÄ att en annan session ska göra nÄgot. Och i detta ögonblick vÀntar en annan session pÄ den första sessionen för att göra nÄgot.

Och, till exempel, om Ivan sÀger: "Ge mig nÄgot," och jag sÀger: "Nej, jag kommer bara att ge det till dig om du ger mig nÄgot annat." Och han sÀger, "Nej, jag kommer inte att ge det till dig om du inte ger det till mig." Och vi hamnar i en dödlÀge. Jag Àr sÀker pÄ att Ivan inte kommer att göra detta, men du förstÄr innebörden av att vi har tvÄ personer som vill fÄ nÄgot och de Àr inte redo att ge bort det förrÀn den andra personen ger dem vad de vill ha. Och det finns ingen lösning.

Och i huvudsak mÄste din databas upptÀcka detta. Och sedan mÄste du ta bort eller stÀnga en av sessionerna, för annars kommer de att förbli dÀr för alltid. Och vi ser det i databaser, vi ser det i operativsystem. Och pÄ alla stÀllen dÀr vi har parallella processer kan detta hÀnda.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och nu ska vi installera tvÄ dödlÀgen. Vi sÀtter 50 och 80. PÄ första raden uppdaterar jag frÄn 50 till 50. Jag fÄr transaktionsnummer 710.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och sedan Àndrar jag 80 till 81 och 50 till 51.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och sÄ hÀr kommer det att se ut. SÄ 710 har en rad blockerad och 711 vÀntar pÄ bekrÀftelse. Vi sÄg detta nÀr vi uppdaterade. 710 Àr Àgare till vÄr serie. Och 711 vÀntar pÄ att 710 ska slutföra transaktionen.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och det stÄr till och med pÄ vilken rad lÄsningarna uppstÄr. Och det Àr hÀr det börjar bli konstigt.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Nu uppdaterar vi 80 till 80.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och det Àr hÀr lÄsningarna börjar. 710 vÀntar pÄ svar frÄn 711 och 711 vÀntar pÄ 710. Och detta kommer inte att sluta bra. Och det finns ingen vÀg ur detta. Och de kommer att förvÀnta sig ett svar frÄn varandra.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och det kommer bara att börja försena allt. Och det vill vi inte.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och Postgres har sĂ€tt att mĂ€rka nĂ€r detta hĂ€nder. Och nĂ€r detta hĂ€nder fĂ„r du det hĂ€r felet. Och av detta Ă€r det tydligt att en sĂ„dan och en sĂ„dan process vĂ€ntar pĂ„ ett DELÅS frĂ„n en annan process, d.v.s. som Ă€r blockerad av 711-processen. Och den processen vĂ€ntade pĂ„ att ett DELÅS skulle ges pĂ„ ett sĂ„dant och ett transaktions-ID och blockerades av en sĂ„dan och en sĂ„dan process. DĂ€rför rĂ„der hĂ€r ett dödlĂ€ge.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Finns det trevĂ€gs lĂ„sningar? Är det möjligt? Ja.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vi matar in dessa siffror i en tabell. Vi Àndrar 40 till 40, vi blockerar.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Vi Àndrar 60 till 61, 80 till 81.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och sÄ byter vi 80 och sedan bom!

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och 714 vÀntar nu pÄ 715. 716:an vÀntar pÄ 715:an. Och inget kan göras Ät det.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Det Àr inte lÀngre tvÄ personer hÀr, det finns redan tre personer hÀr. Jag vill ha nÄgot av dig, den hÀr vill ha nÄgot av en tredje person och den tredje personen vill ha nÄgot av mig. Och vi hamnar i en trevÀgsvÀnta eftersom vi alla vÀntar pÄ att den andra personen ska slutföra vad de behöver göra.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och Postgres vet pÄ vilken rad detta hÀnder. Och sÄ kommer det att ge dig följande meddelande, som visar att du har ett problem dÀr tre ingÄngar blockerar varandra. Och det finns inga begrÀnsningar hÀr. Detta kan vara fallet nÀr 20 poster blockerar varandra.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

NĂ€sta problem kan serialiseras.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Om speciellt serialiserbart lÄs.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och vi ÄtergÄr till 719. Dess uteffekt Àr ganska normal.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och du kan klicka för att göra transaktionen frÄn serialiserbar.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och du inser att du nu har en annan typ av SA-lÄs - det betyder serialiserbart.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och sÄ har vi en ny typ av lÄs som heter SARieadLock, som Àr ett seriellt lÄs och lÄter dig ange serier.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och du kan ocksÄ infoga unika index.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

I den hÀr tabellen har vi unika index.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

SÄ om jag sÀtter in siffran 2 hÀr, sÄ har jag en 2:a. Men lÀngst upp lÀgger jag in ytterligare 2. Och du kan se att 721 har ett exklusivt lÄs. Men nu vÀntar 722 pÄ att 721 ska slutföra sin operation eftersom den inte kan infoga 2 förrÀn den vet vad som kommer att hÀnda med 721.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och om vi gör deltransaktioner.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

HĂ€r har vi 723.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och om vi sparar punkten och sedan uppdaterar den fĂ„r vi ett nytt transaktions-ID. Detta Ă€r ett annat beteendemönster du mĂ„ste vara medveten om. Om vi ​​returnerar detta, försvinner transaktions-ID:t. 724 gĂ„r. Men nu har vi 725.

SÄ vad försöker jag göra hÀr? Jag försöker visa dig exempel pÄ ovanliga lÄs som du kan hitta: oavsett om det Àr serialiserbara lÄs eller SAVEPOINT, det Àr olika typer av lÄs som kommer att dyka upp i lÄstabellen.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Detta Àr skapandet av explicita (explicita) lÄs, som har pg_advisory_lock.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och du ser att blockeringstypen Àr listad som rÄdgivande. Och hÀr stÄr det "rÄdgivande" i rött. Och du kan samtidigt blockera sÄ hÀr med pg_advisory_unlock.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och avslutningsvis skulle jag vilja visa er ytterligare en hÀpnadsvÀckande sak. Jag skapar en annan vy. Men jag kommer att förena tabellen pg_locks med tabellen pg_stat_activity. Och varför vill jag göra det hÀr? Eftersom detta gör att jag kan titta och se alla aktuella sessioner och se exakt vilken typ av lÄs de vÀntar pÄ. Och detta Àr ganska intressant nÀr vi sÀtter ihop lÄstabellen och frÄgetabellen.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och hÀr skapar vi pg_stat_view.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och vi uppdaterar raden i taget. Och hÀr ser vi 724. Och sÄ uppdaterar vi vÄr rad till tre. Och vad ser du hÀr nu? Dessa Àr förfrÄgningar, det vill sÀga du ser hela listan med förfrÄgningar som finns listade i den vÀnstra kolumnen. Och sedan pÄ höger sida kan du se blockeringarna och vad de skapar. Och det kan vara tydligare för dig sÄ att du inte behöver gÄ tillbaka till varje pass varje gÄng och se om du behöver vara med eller inte. De gör det Ät oss.

En annan funktion som Àr mycket anvÀndbar Àr pg_blocking_pids. Du har förmodligen aldrig hört talas om henne. Vad gör hon? Det lÄter oss berÀtta att för denna session 11740 vilka specifika process-ID:n den vÀntar pÄ. Och du kan se att 11740 vÀntar pÄ 724. Och 724 Àr allra högst upp. Och 11306 Àr ditt process-ID. I huvudsak gÄr denna funktion genom ditt lÄsbord. Och jag vet att det Àr lite komplicerat, men man lyckas förstÄ det. Den hÀr funktionen gÄr i huvudsak igenom den hÀr lÄstabellen och försöker hitta var detta process-ID ges de lÄs som den vÀntar pÄ. Och den försöker ocksÄ ta reda pÄ vilket process-ID processen som vÀntar pÄ lÄset har. SÄ du kan köra den hÀr funktionen pg_blocking_pids.

Och detta kan vara mycket anvÀndbart. Vi har bara lagt till detta i version 9.6, sÄ den hÀr funktionen Àr bara 5 Är gammal, men den Àr vÀldigt, vÀldigt anvÀndbar. Och detsamma gÀller den andra begÀran. Det visar precis vad vi behöver se.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Det hÀr Àr vad jag ville prata med dig om. Och som jag förvÀntade mig anvÀnde vi all vÄr tid eftersom det var sÄ mÄnga rutschkanor. Och bilderna finns att ladda ner. Jag skulle vilja tacka dig för att du Àr hÀr. Jag Àr sÀker pÄ att du kommer att njuta av resten av konferensen, tack sÄ mycket!

FrÄgor:

Till exempel, om jag försöker uppdatera rader och den andra sessionen försöker ta bort hela tabellen. Vad jag förstÄr borde det finnas nÄgot som liknar ett avsiktslÄs. Finns det nÄgot sÄdant i Postgres?

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

LÄt oss gÄ tillbaka till början. Du kanske kommer ihÄg att nÀr du gör nÄgot, till exempel nÀr du gör ett SELECT, utfÀrdar vi ett AccessShareLock. Och detta förhindrar att bordet tappas. SÄ om du till exempel vill uppdatera en rad i en tabell eller ta bort en rad, sÄ kan nÄgon inte ta bort hela tabellen samtidigt eftersom du hÄller detta AccessShareLock över hela tabellen och över raden. Och nÀr du Àr klar kan de ta bort den. Men medan du direkt Àndrar nÄgot dÀr, kommer de inte att kunna göra det.

Vi gör det igen. LÄt oss gÄ vidare till raderingsexemplet. Och du ser hur det finns ett exklusivt lÄs pÄ raden ovanför hela bordet.

Detta kommer att se ut som lÄsexklusivt, eller hur?

Ja, det ser ut som det. Jag förstÄr vad du pratar om. Du sÀger att om jag gör en SELECT sÄ har jag en ShareExclusive och sedan gör jag den Row Exclusive, blir det ett problem? Men förvÄnansvÀrt nog utgör detta inga problem. Detta ser ut som att öka lÄsgraden, men i huvudsak har jag ett lÄs som förhindrar radering. Och nu, nÀr jag gör det hÀr lÄset kraftfullare, förhindrar det fortfarande radering. SÄ det Àr inte sÄ att jag gÄr upp. Det vill sÀga, det hindrade det frÄn att hÀnda nÀr det var pÄ en lÀgre nivÄ ocksÄ, sÄ nÀr jag höjer dess nivÄ förhindrar det fortfarande att tabellen raderas.

Jag förstÄr vad du pratar om. Det finns inget lÄseskaleringsfall hÀr, dÀr du försöker ge upp ett lÄs för att införa ett starkare. HÀr ökar det bara detta förebyggande över hela linjen, sÄ det skapar ingen konflikt. Men det Àr en bra frÄga. Tack sÄ mycket för att du frÄgar detta!

Vad behöver vi göra för att undvika en dödlÀge nÀr vi har mÄnga sessioner, ett stort antal anvÀndare?

Postgres mÀrker automatiskt dödlÀgessituationer. Och det kommer automatiskt att ta bort en av sessionerna. Det enda sÀttet att undvika död blockering Àr att blockera personer i samma ordning. SÄ nÀr du tittar pÄ din ansökan, ofta orsaken till dödlÀgen... LÄt oss förestÀlla oss att jag vill blockera tvÄ olika saker. En applikation lÄser tabell 1 och en annan applikation lÄser 2 och sedan tabell 1. Och det enklaste sÀttet att undvika dödlÀge Àr att titta pÄ din applikation och försöka se till att lÄsningen sker i samma ordning i alla applikationer. Och detta eliminerar vanligtvis 80% av problemen, eftersom alla typer av mÀnniskor skriver dessa ansökningar. Och om du blockerar dem i samma ordning, stöter du inte pÄ en dödlÀgessituation.

Tack sÄ mycket för din prestation! Du pratade om vakuum fullt och, om jag förstÄr det rÀtt, sÄ förvrÀnger vakuum fullt ordningen pÄ poster i separat lagring, sÄ de behÄller de nuvarande posterna oförÀndrade. Varför tar vakuum full exklusiv lÄsÄtkomst och varför kommer det i konflikt med skrivoperationer?

Det Ă€r en bra frĂ„ga. Anledningen Ă€r att vakuum fullt tar bordet. Och vi skapar i princip en ny version av tabellen. Och bordet blir nytt. Det visar sig att detta kommer att vara en helt ny version av tabellen. Och problemet Ă€r att nĂ€r vi gör det hĂ€r vill vi inte att folk ska lĂ€sa det eftersom vi behöver dem för att se den nya tabellen. Och sĂ„ ansluter detta till föregĂ„ende frĂ„ga. Om vi ​​kunde lĂ€sa samtidigt skulle vi inte kunna flytta det och dirigera folk till ett nytt bord. Vi skulle behöva vĂ€nta tills alla lĂ€st klart den hĂ€r tabellen, sĂ„ det Ă€r i princip en lĂ„sexklusiv situation.
Vi sÀger bara att vi lÄser frÄn början eftersom vi vet att vi i slutet kommer att behöva ett exklusivt lÄs för att kunna flytta alla till det nya exemplaret. SÄ vi kan potentiellt lösa detta. Och vi gör det pÄ detta sÀtt med samtidig indexering. Men det hÀr Àr mycket svÄrare att göra. Och detta hÀnger mycket ihop med din tidigare frÄga om lÄs exklusivt.

Är det möjligt att lĂ€gga till lĂ„sningstidsgrĂ€ns till Postgres? I Oracle kan jag till exempel skriva "vĂ€lj att uppdatera" och vĂ€nta 50 sekunder innan jag uppdaterar. Det var bra för applikationen. Men i Postgres mĂ„ste jag antingen göra det direkt och inte vĂ€nta alls, eller vĂ€nta till ett tag.

Ja, du kan vÀlja en timeout pÄ dina lÄs, pÄ dina lÄs. Du kan ocksÄ utfÀrda ett no way-kommando, vilket kommer... om du inte omedelbart kan fÄ lÄset. DÀrför antingen en lÄsningstid eller nÄgot annat som gör att du kan göra detta. Detta görs inte pÄ den syntaktiska nivÄn. Detta görs som en variabel pÄ servern. Ibland kan detta inte anvÀndas.

Kan du öppna bild 75?

Ja.

LĂ„ser upp Postgres Lock Manager. Bruce Momjian

Och min frÄga Àr följande. Varför vÀntar bÄda uppdateringsprocesserna 703?

Och det hÀr Àr en jÀttebra frÄga. Jag förstÄr förresten inte varför Postgres gör det hÀr. Men nÀr 703 skapades vÀntade den 702. Och nÀr 704 och 705 dyker upp verkar det som om de inte vet vad de förvÀntar sig eftersom det inte finns nÄgot dÀr Àn. Och Postgres gör det sÄ hÀr: nÀr du inte kan fÄ ett lÄs, skriver den "Vad Àr poÀngen med att behandla dig?", eftersom du redan vÀntar pÄ nÄgon. SÄ vi lÄter det bara hÀnga i luften, det kommer inte att uppdatera det alls. Men vad hÀnde hÀr? SÄ snart 702 slutförde processen och 703 fick sitt lÄs, ÄtervÀnde systemet tillbaka. Och hon sa att nu har vi tvÄ personer som vÀntar. Och lÄt oss sedan uppdatera dem tillsammans. Och lÄt oss indikera att bÄda vÀntar.

Jag vet inte varför Postgres gör det hĂ€r. Men det finns ett problem som heter f
. Det verkar för mig att detta inte Ă€r en term pĂ„ ryska. Det Ă€r dĂ„ alla vĂ€ntar pĂ„ ett slott, Ă€ven om det Ă€r 20 myndigheter som vĂ€ntar pĂ„ slottet. Och plötsligt vaknar de alla samtidigt. Och alla börjar försöka reagera. Men systemet gör att alla vĂ€ntar pĂ„ 703. För de vĂ€ntar alla, och vi kommer omedelbart att rada upp alla. Och om nĂ„gon annan ny förfrĂ„gan dyker upp som genererades efter detta, till exempel 707, kommer det att bli tomhet igen.

Och det verkar för mig att detta Àr gjort sÄ att vi kan sÀga att i det hÀr skedet vÀntar 702 pÄ 703, och alla de som kommer efter det kommer inte att ha nÄgon post i detta fÀlt. Men sÄ fort den första servitören gÄr fÄr alla som vÀntade i det ögonblicket innan uppdateringen samma token. Och sÄ tror jag att det hÀr Àr gjort för att vi ska kunna bearbeta i ordning sÄ att de blir ordentligt bestÀllda.

Jag sÄg alltid pÄ det hÀr som ett ganska konstigt fenomen. För hÀr, till exempel, listar vi dem inte alls. Men det verkar för mig att varje gÄng vi ger ett nytt lÄs sÄ tittar vi pÄ alla de som Àr i fÀrd med att vÀnta. Sedan radar vi upp dem alla. Och dÄ kommer en ny som kommer in först i kön nÀr nÀsta person har bearbetats fÀrdigt. Mycket bra frÄga. Tack sÄ mycket för din frÄga!

Det verkar för mig som att det Àr mycket mer logiskt nÀr 705 förvÀntar sig 704.

Men problemet hÀr Àr följande. Tekniskt sett kan du vÀcka det ena eller det andra. Och sÄ kommer vi att vakna upp det ena eller det andra. Men vad hÀnder i systemet? Du kan se hur 703 högst upp har blockerat sitt eget transaktions-ID. SÄ hÀr fungerar Postgres. Och 703 Àr blockerad av sitt eget transaktions-ID, sÄ om nÄgon vill vÀnta kommer de att vÀnta pÄ 703. Och i huvudsak slutförs 703. Och först efter dess slutförs vaknar en av processerna. Och vi vet inte exakt vad denna process kommer att vara. Sedan bearbetar vi allt gradvis. Men det Àr inte klart vilken process som vÀcks först, eftersom det kan vara nÄgon av dessa processer. I huvudsak hade vi en schemalÀggare som sa att vi nu kan vÀcka nÄgon av dessa processer. Vi vÀljer bara en slumpmÀssigt. SÄ bÄda mÄste noteras eftersom vi kan vÀcka nÄgon av dem.

Och problemet Àr att vi har CP-oÀndlighet. Och dÀrför Àr det ganska troligt att vi kan vÀcka den senare. Och om vi till exempel vÀcker den senare kommer vi att vÀnta pÄ den som precis fÄtt blocket, sÄ vi bestÀmmer inte vem som ska vÀckas först. Vi skapar helt enkelt en sÄdan situation, och systemet kommer att vÀcka dem i en slumpmÀssig ordning.

Det finns artiklar om lĂ„s av Egor Rogov. Titta, de Ă€r ocksĂ„ intressanta och anvĂ€ndbara. Ämnet Ă€r naturligtvis fruktansvĂ€rt komplext. Tack sĂ„ mycket, Bruce!

KĂ€lla: will.com

LĂ€gg en kommentar