Postgres lukuhalduri avamine. Bruce Momjian

Bruce Momjani 2020. aasta ettekande "Postgres lukuhalduri avamine" kokkuvÔte.

Postgres lukuhalduri avamine. Bruce Momjian

(MĂ€rkuseks: KĂ”ik SQL-kĂŒsimused slaididelt saate selle lingi kaudu: http://momjian.us/main/writings/pgsql/locking.sql)

Tere! On suurepĂ€rane taas olla siin Venemaal. Palun vabandage, et ma ei saanud eelmisel aastal tulla, kuid sel aastal on Ivanil ja mul suured plaanid. Loodan, et olen siin palju sagedamini. Armastan Venemaale reisida. Kavatse sel kĂŒlastada Tjumenit ja Tveri. Olen vĂ€ga Ă”nnelik, et saan nende linnadega tutvuda.

Minu nimi on Bruce Momjian. Töötan EnterpriseDB-s ja olen töötanud Postgresi kallal ĂŒle 23 aasta. Elan Filadelfias, Ameerika Ühendriikides. Reisitan umbes 90 pĂ€eva aastas ja kĂ€in umbes 40 konverentsil. Minu veebileht, kus on slaidid, mida ma teile nĂŒĂŒd nĂ€itan. Seega pĂ€rast konverentsi vĂ”ite need minu isiklikult veebilehelt alla laadida. Seal on ka umbes 30 presentatsiooni, videoid ja palju blogipostitusi — ĂŒle 500. See on piisavalt sisukas ressurss. Ja kui teid huvitab see materjal, siis kutsun teid seda kasutama.

Olen varem olnud Ă”ppejĂ”ud ja professor, enne kui alusin töötama Postgresiga. Olen vĂ€ga rÔÔmus, et saan teiega jagada seda, mida kavatseme arutada. See on ĂŒks minu kĂ”ige pĂ”nevamaid ettekandeid ning see sisaldab 110 slaidi. Alustame lihtsatest asjadest ning lĂ”puks muutub arutelu ĂŒha keerulisemaks ja keerulisemaks.

Postgres lukuhalduri avamine. Bruce Momjian

See on ĂŒsna ebameeldiv jutt. Lukustus ei ole kĂ”ige populaarsem teema. Me soovime, et see kaoks kuhugi. See on nagu hambaarsti juurde minemine.

Postgres lukuhalduri avamine. Bruce Momjian

  1. Lukustus on probleem paljudele, kes töötavad andmebaasidega ja kellel on samaaegselt mitu protsessi. Neile on lukustus vajalik. TÀna annan teile pÔhiteadmised lukustamisest.
  2. Tehingu identifikaatorid. See on ĂŒsna igav osa esitlust, kuid need tuleb mĂ”ista.
  3. JĂ€rgnevalt rÀÀgime lukustamise tĂŒĂŒpidest. See on piisavalt mehaaniline osa.
  4. SeejÀrel toome mÔned nÀited lukustamisest. See osutub piisavalt keeruliseks arusaamiseks.

Postgres lukuhalduri avamine. Bruce Momjian

RÀÀgime lukustustest.

Postgres lukuhalduri avamine. Bruce Momjian

Meie terminoloogia on ĂŒsnagi keeruline. Kui paljud teist teavad, kust see lĂ”ik pĂ€rit on? Kaks inimest. See on mĂ€ngust nimega „Kohutav seiklus koopas“. See oli tekstipĂ”hine videomĂ€ng 80ndatel aastatel, nii et mulle tundub. Seal pidid minema koopasse, labĂŒrinti ja tekst muutus, kuid sisu oli sisuliselt iga kord sama. Nii mĂ€letan ma seda mĂ€ngu.

Postgres lukuhalduri avamine. Bruce Momjian

Ja siin nÀeme blokeerimise nimetusi, mis on meieni tulnud Oracle'ilt. Me kasutame neid.

Postgres lukuhalduri avamine. Bruce Momjian

Siin nĂ€eme mĂ”isteid, mis mind segadusse ajavad. NĂ€iteks SHARE UPDATE EXCLUSIVE. JĂ€rgmiseks SHARE RAW EXCLUSIVE. Ausalt öeldes ei ole need nimetused vĂ€ga arusaadavad. Proovime need pĂ”hjalikumalt lĂ€bi vaadata. MĂ”ned sisaldavad sĂ”na „share“, mis tĂ€hendab – eralduma. MĂ”ned sisaldavad sĂ”na „exclusive“ — eksklusiivne. MĂ”ned sisaldavad mĂ”lemat sĂ”na. Tahaksin alustada sellest, kuidas need blokeeringud töötavad.

Postgres lukuhalduri avamine. Bruce Momjian

Ja ka vĂ€ga tĂ€htis on sĂ”na „juurdepÀÀs“ — access. Ja sĂ”na „row“ — rida. St juurdepÀÀsu ja ridade jaotamine.

Postgres lukuhalduri avamine. Bruce Momjian

Teine probleem, mida tuleb Postgresis mÔista, on MVCC, millest ma kahjuks oma ettekandes rÀÀkida ei saa. Mul on sellel teemal eraldi esitus minu veebisaidil. Ja kui arvate, et see esitus on keeruline, siis MVCC on tÔenÀoliselt minu kÔige keerulisem. Kui teid huvitab, vÔite selle veebisaidilt vaadata. Vaadata saate ka videot.

Postgres lukuhalduri avamine. Bruce Momjian

Veel ĂŒks punkt, mida peame mĂ”istma, on tehinguidentifikaatorid. Paljud tehingud ei saa töötada ilma unikaalsete identifikaatoriteta. Siin seletataksegi, mis asi on tehing. Postgresis on kaks tehingu numbrite sĂŒsteemi. Tean, et see ei ole eriti ilus lahendus.

Postgres lukuhalduri avamine. Bruce Momjian

Samuti pidage meeles, et slaidid on piisavalt keerulised, et neid mÔista, seega peate tÀhelepanu pöörama sellele, mis on punasega esile tÔstetud.

Postgres lukuhalduri avamine. Bruce Momjian

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

Vaatame. Punasega on esile tÔstetud tehingu number. Siin on kuvatud funktsioon SELECT pg_back. See tagastab minu tehingu ja selle tehingu ID.

Veel ĂŒks punkt — kui teile meeldib see esitlus ja soovite selle oma andmebaasi kĂ€ivitada, siis saate minna lĂ€bi selle roosa vĂ€rviga esile tĂ”stetud lingi ning alla laadida esituse SQL-i. Ja saate selle lihtsalt oma PSQL-is kĂ€ivitada ning kogu esitlus ilmub teie ekraanile koheselt. See ei sisalda vĂ€rve, kuid vĂ€hemalt saame selle nĂ€ha.

Postgres lukuhalduri avamine. Bruce Momjian

Antud juhul nĂ€eme tehingu ID-d. See on number, mille oleme talle mÀÀranud. Ja Postgresis on veel ĂŒks tehingu ID tĂŒĂŒp, mida nimetatakse virtuaalseks tehingu ID-ks.

Peame seda mÔistma. See on vÀga oluline, vastasel juhul ei saa me Postgresis blokeeringut mÔista.

Virtuaalne tehingu ID on tehingu ID, mis ei sisalda pĂŒsivaid vÀÀrtusi. NĂ€iteks, kui ma kĂ€ivitan kĂ€su SELECT, siis on tĂ”enĂ€oline, et ma ei muuda andmebaasi, ma ei blokeeri midagi. Seega, kui me kĂ€ivitame lihtsa SELECT-i, ei anna me sellele tehingule pĂŒsivat ID-d. Anname talle seal ainult virtuaalse ID.

Ja see parandab Postgresi jÔudlust ning tÀiustab puhastusvÔimalusi, mistÔttu virtuaalne tehingu ID koosneb kahest numbrist. Esimene number kaldkriipsu ees on tagasihoidliku ID. Ja paremal nÀeme lihtsalt loendurit.

Postgres lukuhalduri avamine. Bruce Momjian

SeetĂ”ttu, kui kĂ€itan pĂ€ringu, ĂŒtleb see, et tagasihoidlik ID on 2.

Postgres lukuhalduri avamine. Bruce Momjian

Ja kui kÀitan selliseid tehingute seeriaid, nÀeme, et loendur suureneb iga kord, kui kÀitan pÀringu. NÀiteks, kui kÀitan pÀringut 2/10, 2/11, 2/12 jne.

Postgres lukuhalduri avamine. Bruce Momjian

Pange tĂ€hele, et siin on kaks veergu. Vasakul nĂ€eme virtuaalset tehingu ID-d – 2/12. Ja paremal on meil pĂŒsiv tehingu ID. Ja see vĂ€li on tĂŒhi. See tehing ei muuda andmebaasi. SeetĂ”ttu ei omista ma sellele pĂŒsivat tehingu ID-d.

Postgres lukuhalduri avamine. Bruce Momjian

Kuna olen kĂ€ivitanud analĂŒĂŒsimis kĂ€su (ANALYZE), annab sama pĂ€ring mulle pĂŒsiva tehingu ID. Vaadake, kuidas see on muutunud. Varem ei olnud mul seda ID-d, nĂŒĂŒd see on olemas.

Postgres lukuhalduri avamine. Bruce Momjian

Nii et siin on veel ĂŒks pĂ€ring, veel ĂŒks tehing. Virtuaalne tehingu number – 2/13. Ja kui palun pĂŒsivat tehingu ID-d, siis kui kĂ€itan pĂ€ringu, saan selle.

Postgres lukuhalduri avamine. Bruce Momjian

Nii et, veel kord. Meil on virtuaalne tehingu ID ja pĂŒsiv tehingu ID. Lihtsalt mĂ”istke seda punkti, et aru saada Postgres'i kĂ€itumisest.

Postgres lukuhalduri avamine. Bruce Momjian

Liigume kolmandasse sektsiooni. Siin kĂ€ime lihtsalt lĂ€bi erinevad lukustustĂŒĂŒbid Postgres'is. See pole vĂ€ga huvitav. Viimane sektsioon tuleb palju huvitavam. Kuid me peame uurima pĂ”hiasju, vastasel juhul ei saa me aru, mis edasi tuleb.

Me vaatame selle sektsiooni lĂ€bi, vaatame iga lukustustĂŒĂŒbi. Ja ma nĂ€itan teile nĂ€iteid, kuidas need kehtestatakse, kuidas need töötavad, ning tutvustan teile mĂ”ned pĂ€ringud, mida saab kasutada, et nĂ€ha, kuidas lukustus Postgres'is töötab.

Postgres lukuhalduri avamine. Bruce Momjian

KĂŒsimuse esitamiseks ja selle nĂ€gemiseks, mis Postgres'is toimub, peame esitama pĂ€ringu sĂŒsteemi vaatesse. Antud juhul on meil punasega esile tĂ”stetud pg_lock. Pg_lock on sĂŒsteemtablett, mis ĂŒtleb meile, millised lukustused on hetkel Postgres'is kasutusel.

Siiski on mul vĂ€ga raske nĂ€idata teile pg_lock'i endast, sest see on ĂŒsna keeruline. SeetĂ”ttu lĂ”in vaate, mis nĂ€itab pg_locks'i. Ja see teeb ka minu jaoks teatud tööd, mis aitab mul paremini mĂ”ista. St. see vĂ€listab minu lukustused, minu enda sessiooni jne. See on lihtsalt standardne SQL ja see vĂ”imaldab paremini nĂ€idata, mis toimub.

Postgres lukuhalduri avamine. Bruce Momjian

Teine probleem on see, et see vaade on vĂ€ga lai, seega pean looma teise – lockview2.

Postgres lukuhalduri avamine. Bruce Momjian Ja see nĂ€itab mulle veel veerge tabelist. Ja veel ĂŒks, mis nĂ€itab mulle ĂŒlejÀÀnud veerge. See on piisavalt keeruline, seega pĂŒĂŒdsin seda esitada nii lihtsalt kui vĂ”imalik.

Postgres lukuhalduri avamine. Bruce Momjian

Nii et lĂ”ime tabeli nimega Lockdemo. Ja lĂ”ime seal ĂŒhe rea. See on meie nĂ€idistabel. Ja loome sektsioonid, et lihtsalt nĂ€idata teile lukustuse nĂ€iteid.

Postgres lukuhalduri avamine. Bruce Momjian

Nii et ĂŒks rida, ĂŒks veerg. Esimene lukustustĂŒĂŒp nimetatakse ACCESS SHARE. See on kĂ”ige vĂ€hem piirav lukustus. See tĂ€hendab, et see praktiliselt ei konflikti teiste lukustustega.

Ja kui me tahame blokeerimist selgelt mÀÀratleda, kĂ€ivitame kĂ€su «lock table». See blokeerib selgelt, st ACCESS SHARE reĆŸiimis kĂ€ivitame lock table. Ja kui kĂ€ivitan PSQL taustal, siis kĂ€ivitan seega oma esimesest sessioonist teise seansi. Mida ma siin teen? Liigun teise seansi juurde ja ĂŒtlen, et nĂ€itaks mulle lockview antud pĂ€ringu jaoks. Siin on mul AccessShareLock selles tabelis. See on just see, mida ma kĂŒsisin. Ja ta ĂŒtleb, et blokeering on mÀÀratud. VĂ€ga lihtne.

Postgres lukuhalduri avamine. Bruce Momjian

Kui vaatame teist veergu, siis seal pole midagi. Need on tĂŒhjad.

Postgres lukuhalduri avamine. Bruce Momjian

Ja kui ma kĂ€ivitan kĂ€su «SELECT», siis see on kaudne (ilmne) viis AccessShareLocki taotlemiseks. SeetĂ”ttu vabastan oma tabeli ja kĂ€ivitan pĂ€ringu ning pĂ€ring tagastab mitu rida. Ja ĂŒhes neist ridadest nĂ€eme AccessShareLocki. Seega kutsub SELECT tabelis esile AccessShareLocki. Ja see ei konflikti praktiliselt millegagi, kuna on madala tasemega blokeering.

Postgres lukuhalduri avamine. Bruce Momjian

Kuidas oleks, kui ma kĂ€ivitan SELECTi ja mul on kolm erinevat tabelit? Varasemalt kĂ€ivitasin ainult ĂŒhe tabeli, nĂŒĂŒd kĂ€ivitan kolm: pg_class, pg_namespace ja pg_attribute.

Postgres lukuhalduri avamine. Bruce Momjian

Ja nĂŒĂŒd, kui ma vaatan pĂ€ringut, nĂ€en 9 AccessShareLocks kolme tabeliga. Miks? Sinise vĂ€rviga on esile tĂ”stetud kolm tabelit: pg_attribute, pg_class, pg_namespace. Kuid nĂ€ete ka, et kĂ”ik indekseerimised, mis on mÀÀratletud nende tabelite kaudu, omavad samuti AccessShareLock'i.

Ja tegemist on lukustusega, mis praktiliselt ei tekita konflikte teistega. KĂ”ik, mida see teeb, on see, et see ei luba meil tabelit tagasi tĂ”mmata, kuni me seda valime. See on mĂ”istetav. St kui me valime tabeli ja see hetk Ă€kki kaob, siis see oleks vale, seega AccessShare on madalama taseme lukustus, mis ĂŒtleb meile 'Ă€rge kustutage seda tabelit, kuni ma töötan'. PĂ”himĂ”tteliselt on see kĂ”ik, mida ta teeb.

Postgres lukuhalduri avamine. Bruce Momjian

ROW SHARE on lukustus, mis erineb veidi.

Postgres lukuhalduri avamine. Bruce Momjian

VÔtame nÀite. SELECT ROW SHARE on lukustusmeetod, mis lukustab iga rida eraldi. Sel viisil ei saa keegi neid kustutada vÔi muuta seni, kuni me neid vaatame.

Postgres lukuhalduri avamine. Bruce MomjianNii et, mis teeb SHARE LOCK? NĂ€eme, et tehingu ID on 681 SELECT'i jaoks. Ja see on huvitav. Mis siin juhtus? Esmakordselt nĂ€eme numbrit vĂ€lja „Lock“. Me vĂ”tame tehingu ID ja see ĂŒtleb, et see lukustab selle eksklusiivses reĆŸiimis. KĂ”ik, mida ta ĂŒtleb, on see, et mul on rida, mis on tehniliselt kuskil tabelis lukustatud. Aga ei ĂŒtle, kus tĂ€pselt. Veidi hiljem vaatame seda lĂ€hemalt.

Postgres lukuhalduri avamine. Bruce Momjian

Siin rÀÀgime, et lukustus on meie poolt kasutusel.

Postgres lukuhalduri avamine. Bruce Momjian

Nii et eksklusiivne lukustus ĂŒtleb selgelt, et see on eksklusiivne. Ja samuti, kui kustutate selle tabeli rea, siis see juhtub, nagu te nĂ€ete.

Postgres lukuhalduri avamine. Bruce Momjian

SHARE EXCLUSIVE – see on pikem lukustus.

Postgres lukuhalduri avamine. Bruce Momjian

See (ANALYZE) on analĂŒĂŒsikĂ€sk, mida kasutatakse.

Postgres lukuhalduri avamine. Bruce Momjian

SHARE LOCK – saate seda selgelt lukustada jagamises.

Postgres lukuhalduri avamine. Bruce Momjian

Saate ka luua unikaalse indeksi. Ja seal nÀete SHARE LOCK'i, mis on nende osa. Ja see lukustab tabeli ning seab sellele SHARE LOCK'i.

Vaikimisi SHARE LOCK tabelis tÀhendab, et teised inimesed saavad tabelit lugeda, kuid keegi ei saa seda modifitseerida. Just nii kÀibki, kui loote unikaalse indeksi.

Kui ma loon unikaalse indeksi concurrently, siis mul on teine ​​tĂŒĂŒp lukku, sest nagu te mĂ€letate, vĂ€hendab concurrently indeksite kasutamine lukustusnĂ”udeid. Ja kui ma kasutan tavalist lukku, tavalist indeksit, takistab see kirjutamist indeksitabelisse selle loomise ajal. Kui ma kasutan concurrently indeksit, tuleb mul kasutada teistsugust lukku.

Postgres lukuhalduri avamine. Bruce Momjian

SHARE ROW EXCLUSIVE – selle saab samuti mÀÀrata eksplicitset (selgelt).

Postgres lukuhalduri avamine. Bruce Momjian

VÔi vÔime luua reegli, st vÔtta mingi kindel juhtum, millega seda kasutatakse.

Postgres lukuhalduri avamine. Bruce Momjian

EXCLUSIVE lukustus tÀhendab, et keegi teine ei saa tabelit muuta.

Postgres lukuhalduri avamine. Bruce Momjian

Siin nĂ€eme erinevaid lukustuside tĂŒĂŒpe.

Postgres lukuhalduri avamine. Bruce Momjian

ACCESS EXCLUSIVE, nÀiteks, see on lukustamise kÀsk. NÀiteks, kui teete CLUSTER table, siis see tÀhendab, et keegi ei saa sinna kirjutada. Ja see lukustab mitte ainult tabeli enda, vaid ka indeksid.

Postgres lukuhalduri avamine. Bruce Momjian

See on ACCESS EXCLUSIVE blokeerimise teine leht, kus me nĂ€eme tĂ€pselt, mida see tabelis blokeerib. See blokeerib tabeli ĂŒksikud read, mis on piisavalt huvitav.

See on kogu pĂ”hiteave, mida ma tahtsin anda. RÀÀkisime blokeeringutest, tehingu ID-dest, rÀÀkisime virtuaalsetest tehingu ID-dest ja pĂŒsivatest tehingu ID-dest.

Postgres lukuhalduri avamine. Bruce Momjian

Ja nĂŒĂŒd vaatame blokeerimise nĂ€iteid. See on kĂ”ige huvitavam osa. Vaatame vĂ€ga huvitavaid juhtumeid. Ja minu ĂŒlesanne selles ettekandes on anda teile parem ĂŒlevaade sellest, mida Postgres tegelikult teeb, kui ta pĂŒĂŒab teisi asju blokeerida. Mul on tunne, et ta oskab vĂ€ga hĂ€sti blokeerida ĂŒksikuid osi.

Vaatame kindlaid nÀiteid.

Postgres lukuhalduri avamine. Bruce Momjian

Alustame tabelitest ja ĂŒhest reast tabelis. Kui ma midagi sisestan, kuvatakse mulle ExclusiveLock, tehingu ID ja ExclusiveLock tabelis.

Postgres lukuhalduri avamine. Bruce Momjian

EntÀ mitÀ tapahtuu, jos lisÀÀn vielÀ kaksi riviÀ? Nyt taulukossamme on kolme riviÀ. LisÀsin yhden rivin ja sain tÀllaisen tuloksen. Ja jos lisÀÀn vielÀ kaksi riviÀ, mikÀ tÀssÀ on outoa? TÀssÀ on outous, sillÀ olen lisÀnnyt kolme riviÀ tÀhÀn taulukkoon, mutta minulla on silti vain kaksi riviÀ lukitus-taulukossa. Ja tÀmÀ on itse asiassa Postgresin perus kÀyttÀytyminen.

Monet ajattelevat, ettÀ jos tietokannassa lukitset 100 riviÀ, niin tarvitset 100 lukitusmerkintÀÀ. Jos lukitsen samanaikaisesti 1 000 riviÀ, tarvitsen 1 000 tÀllaista pyyntöÀ. Ja jos minun tÀytyy lukita miljoona tai miljardi. Mutta jos teemme niin, se ei toimi kovin hyvin. Jos olit kÀyttÀnyt jÀrjestelmÀÀ, joka luo lukitusmerkinnÀt jokaiselle erilliselle riville, huomaat, ettÀ se on hankalaa. Koska sinun on mÀÀritettÀvÀ heti lukitus-taulukko, joka voi ylittyÀ, mutta Postgres ei toimi niin.

Ja sellel slaidil on vĂ€ga oluline, et on selgelt nĂ€ha, et on veel ĂŒks sĂŒsteem, mis töötab MVCC sees, mis lukustab ĂŒksikuid ridu. Seega, kui lukustate miljardeid ridu, ei loo Postgres miljardit eraldi lukustuskommandot. See avaldab vĂ€ga head mĂ”ju jĂ”udlusele.

Postgres lukuhalduri avamine. Bruce Momjian

Aga kuidas on uuendustega? Ma uuendan praegu rida ja vÔite mÀrgata, et see tegi kohe kaks erinevat operatsiooni. Ta lukustas samaaegselt tabeli, kuid lukustas ka indeksi. Ja tal oli vaja lukustada indeks, kuna sellel tabelil on unikaalsed piirangud. Soovime veenduda, et keegi seda ei muuda, seetÔttu me lukustame selle.

Postgres lukuhalduri avamine. Bruce Momjian

Aga mis juhtub, kui tahan uuendada kahte rida? NÀeme, et ta kÀitub samamoodi. Teeme kaks korda rohkem uuendusi, kuid lukustame endiselt sama arvu ridu.

Kui te soovite teada, kuidas Postgres seda teeb, siis peate kuulama minu ettekandeid MVCC-st, et mÔista, kuidas Postgres sisemiselt markeerib neid ridu, mida ta muudab. Ja Postgresil on meetod, millega ta seda teeb, kuid see ei toimu tabelite lukustamise tasemel; see toimub madalamal ja efektiivsemal tasemel.

Postgres lukuhalduri avamine. Bruce Momjian

Ent kui ma tahan midagi kustutada? Kui ma kustutan nĂ€iteks ĂŒhe rea, ja mul on ikka veel kaks lukustust, ja isegi kui ma tahan need kĂ”ik kustutada, on need ikkagi olemas.

Postgres lukuhalduri avamine. Bruce Momjian

Ja nĂ€iteks, kui ma tahan sisestada 1 000 rida, ja siis kas kustutada vĂ”i lisada veel 1 000 rida, siis need individuaalsed read, mida ma lisan vĂ”i muudan, ei salvestata siia. Need salvestatakse madalamal tasemel, ridade enda sees. Ja MVCC ettekandes rÀÀkisin sellest ĂŒksikasjalikult. Kuid on vĂ€ga oluline, et kui analĂŒĂŒsite lukustusi, veenduge, et teil on tabeli taseme lukustus ning et te ei nĂ€e siin, kuidas individuaalsete ridade salvestamine toimub.

Postgres lukuhalduri avamine. Bruce Momjian

Aga kuidas on eksplicitse lukustamisega?

Postgres lukuhalduri avamine. Bruce Momjian

Kui ma klikkin «vÀrskenda», on mul kaks lukustatud rida. Ja kui ma valin need kÔik ja klikkin «vÀrskenda kÔikjal», on mul ikkagi kaks lukustatud kirjet.

Postgres lukuhalduri avamine. Bruce Momjian

Me ei loo eraldi kirjeid iga rida jaoks. Sest siis langeb jÔudlus, seal vÔib olla liiga palju. Ja me vÔime sattuda ebamugavasse olukorda.

Postgres lukuhalduri avamine. Bruce Momjian

Ja sama asi, kui me teeme jagatud, saame teha seda 30 korda.

Postgres lukuhalduri avamine. Bruce Momjian

Me taastame oma tabeli, kustutame kĂ”ik, seejĂ€rel lisame uuesti ĂŒhe rea.

Postgres lukuhalduri avamine. Bruce Momjian

Teine kĂ€itumisviis, mida te nĂ€ete Postgreses, on vĂ€ga hĂ€sti tuntud ja soovitav kĂ€itumine – see on see, et saate tĂ€ita uuendust vĂ”i valimist. Ja saate seda teha samaaegselt. Ja valimine ei blokeeri uuendust ja sama on vastupidine. Me ĂŒtleme lugejale, et Ă€rge blokeerige kirjutajat, ja kirjutaja ei blokeeri lugejat.

Ma nĂ€itan teile selle nĂ€idet. Ma teen nĂŒĂŒd valiku. SeejĂ€rel teeme INSERTi. Ja te saate nĂ€ha – 694. Te nĂ€ete tehingu ID-d, mis viis selle lisamise lĂ€bi. Ja see on see, kuidas see töötab.

Postgres lukuhalduri avamine. Bruce Momjian

Ja kui ma nĂŒĂŒd vaatan oma taustarakenduse ID-d, on see nĂŒĂŒd – 695.

Postgres lukuhalduri avamine. Bruce Momjian

Ja nÀen, et 695 ilmub minu tabelisse.

Postgres lukuhalduri avamine. Bruce Momjian

Ja kui ma vĂ€rskendan seda siit nii, siis saan ma teise juhtumi. Sel juhul on 695 ainulaadne lukustus, ja uuel on sama kĂ€itumine, kuid nende vahel ei teki konflikti, mis on ĂŒsna ebatavaline.

Ja te vĂ”ite mĂ€rgata, et ĂŒlalpool on ShareLock ja allpool on ExclusiveLock. Ja mĂ”lemad tehingud toimisid.

Ja peate kuulama minu esitluse MVCC-st, et mÔista, kuidas see toimub. Aga see illustreerib, et te saate seda teha samaaegselt, s.t. samal ajal teha SELECT ja UPDATE.

Postgres lukuhalduri avamine. Bruce Momjian

LĂ€hme tagasi ja teeme veel ĂŒhe tehingu.

Postgres lukuhalduri avamine. Bruce Momjian

Kui proovite samaaegselt kĂ€ivitada kaks uuendust samal real, siis see lukustub. Ja pidage meeles, et ma rÀÀkisin, et lugemise ajal ei blokeeri see kirja, kuid kirjutaja blokeerib lugejat, kuid ĂŒks kirjutaja blokeerib teise kirjutaja. S.t. me ei saa lasta kahel inimesel sama rida samaaegselt uuendada. Peame ootama, kuni ĂŒks neist lĂ”petab.

Postgres lukuhalduri avamine. Bruce Momjian

Ja selle ĂŒles nĂ€itamiseks vaatan Lockdemo tabelit. Ja vaatame ĂŒhte rida. Tehingut 698.

Oleme selle uuendanud kuni 2. 699 - see on esimene uuendamine. Ja see on lĂ€inud edukalt vĂ”i see on ooteolekus ja ootab, kuni me kinnitame vĂ”i tĂŒhistame.

Postgres lukuhalduri avamine. Bruce Momjian

Aga vaadake midagi muud - 2/51 - see on meie esimene tehing, meie esimene sessioon. 3/112 - see on jĂ€rgmine pĂ€ring, mis ilmus ĂŒleval ja mis muutis selle vÀÀrtuse 3-ks. Ja kui te mĂ€rkate, siis ĂŒlemine blokeeris ise ennast, nimelt 699. Kuid 3/112 ei andnud lukku. Lock_mode veerus on kirjas, et see ootab. See ootab 699. Ja kui vaatate, kus 699 on, siis see on ĂŒleval. Ja mida esimene sessioon tegi? Ta lĂ”i eksklusiivse lukustuse omaenda tehingu ID-le. Just nii teeb Postgres. See blokeerib omaenda tehingu ID. Ja kui soovite oodata, kuni keegi kinnitab vĂ”i tĂŒhistab, peate ootama, kuni on ooteolekus tehing. Ja seetĂ”ttu saame nĂ€ha kummalist rida.

Vaadake veel kord. Vasakul nĂ€eme meie töötlemise ID-d. Teises veerus on meie virtuaalne tehingu ID, kolmandas veerus aga lock_type. Mida see tĂ€hendab? Tegelikult ĂŒtleb see, et see blokeerib tehingu ID. Kuid pange tĂ€hele, et kĂ”ikides ridades allpool on mĂ€rgitud relation. SeetĂ”ttu on teil tabelis kaks tĂŒĂŒpi blokeeringut. On relation blokeering. Samuti on olemas transactionid blokeering, kus blokeerite iseseisvalt, see on tĂ€pselt see, mis toimub esimeses reas vĂ”i allpool, kus transactionid ootab, et 699 lĂ”petaks oma operatsiooni.

Ma vaatan, mis siin toimub. Ja siin toimuvad samal ajal kaks asja. Te vaatate tehingu ID-blokeeringut esimeses reas, mis blokeerib iseennast. Ja see blokeerib iseennast, et panna inimesi ootama.

Kui vaatate 6. rida, siis see on sama kirje, mis esimene. SeetÔttu blokeeritakse tehing 699. 700 blokeerib samuti iseennast. Ja siis allosas nÀete, et me ootame, kuni 699 lÔpetab oma operatsiooni.

Postgres lukuhalduri avamine. Bruce Momjian

Ja lock_type, tuple nÀete numbreid.

Postgres lukuhalduri avamine. Bruce Momjian

Saate nĂ€ha, et see on 0/10. Ja see on lehekĂŒlje number, samuti selle konkreetse rea offset.

Postgres lukuhalduri avamine. Bruce Momjian

Ja nÀete, et see muutub 0/11, kui me uuendame.

Postgres lukuhalduri avamine. Bruce Momjian

Aga tegelikult on see 0/10, kuna see toiming on ootel. Meil on vÔimalus nÀha, et see on see rida, mida ma ootan kinnitamiseks.

Postgres lukuhalduri avamine. Bruce Momjian

Niikaua, kuni me selle kinnitame ja vajutame commit, ning kui uuendamine on finished, siis see, mida me taas saame. Tehing 700 on ainus lukustus, see ei oota kedagi, kuna see on juba commiteeritud. See lihtsalt ootab, et tehing lĂ”petataks. Kui 699 lĂ”peb, ei oota me enam kedagi. Ja nĂŒĂŒd ĂŒtleb tehing 700, et kĂ”ik on korras, et kĂ”ik lukustused, mis vajalikud, on tal olemas kĂ”ikides lubatud tabelites.

Postgres lukuhalduri avamine. Bruce Momjian

Ja et seda kĂ”ike veel keerukamaks muuta, loome veel ĂŒhe view, mis seekord annab meile hierarhia. Ma ei oota, et te selle pĂ€ringu mĂ”istaksite. Kuid see annab meile selgema ĂŒlevaate sellest, mis toimub.

Postgres lukuhalduri avamine. Bruce Momjian

See on rekursiivne view, millel on ka teine sektsioon. Ja see tagastab kÔik koos. Kasutame seda.

Postgres lukuhalduri avamine. Bruce Momjian

Mis siis, kui teeme kolm samal ajal olevat uuendust ja ĂŒtleme, et rida on nĂŒĂŒd kolm. Ja me muudame 3 neljaks.

Postgres lukuhalduri avamine. Bruce Momjian

Ja nÀeme numbrit 4. Ja tehingu ID on 702.

Postgres lukuhalduri avamine. Bruce Momjian

SeejĂ€rel vahetan 4 5 vastu. Ja 5 6, ning 6 7 vastu. Ma seon inimesed jĂ€rjekorda, et oodata, kuni see ĂŒks tehing lĂ”petatakse.

Postgres lukuhalduri avamine. Bruce Momjian

KÔik muutub selgeks. Mis on esimene rida? See on 702. See on tehingu ID, mis algselt mÀÀras selle vÀÀrtuse. Mis mul on Granted veerus? Mul on tÀhised f. Need on minu uuendused (5, 6, 7), mida ei saa heaks kiita, sest me ootame, kuni tehingu ID 702 lÔpetatakse. Siin on tehingu ID lukustus. Ja meil on 5 tehingu ID lukustust.

Ja kui vaatate 704 ja 705, siis seal pole veel midagi kirjas, sest nad ei tea veel, mis toimub. Nad kirjutavad lihtsalt, et ei ole aimugi, mis toimub. Ja nad lÀhevad lihtsalt magama, sest nad ootavad, kuni keegi lÔpetab ja Àratab nad, kui vÔimalus rida vahetada tekib.

Postgres lukuhalduri avamine. Bruce Momjian

Nii see vÀlja nÀeb. Selge on, et nad kÔik ootavad 12. rida.

Postgres lukuhalduri avamine. Bruce Momjian

See on see, mida me siin nÀgime. Siin on 0/12.

Postgres lukuhalduri avamine. Bruce Momjian

Nii et niipea, kui esimene tehing on heaks kiidetud, saate siin nĂ€ha, kuidas hierarhia töötab. Ja nĂŒĂŒd on kĂ”ik selge. Nad kĂ”ik saavad puhtaks. Ja nad on tegelikult ikka veel ootel.

Postgres lukuhalduri avamine. Bruce Momjian

Nii juhtub. 702 kinnitatakse. Ja nĂŒĂŒd 703 saab selle rea lukustuse, seejĂ€rel hakkab 704 ootama, kuni 703 kinnitatakse. Ja 705 ootab samuti seda. Ja kui see kĂ”ik on lĂ”ppenud, puhastavad nad end ise. Tahaksin rĂ”hutada, et kĂ”ik jĂ€rjekorda seadistatakse. See on vĂ€ga sarnane olukorraga ummikus, kus kĂ”ik ootavad esimest autot. Esimene auto peatub ja kĂ”ik seisavad pikaks read. Siis see liigub edasi, jĂ€rgmisel autol on vĂ”imalus edasi sĂ”ita ja saada oma lukustus jne.

Postgres lukuhalduri avamine. Bruce Momjian

Ja kui see tundub teile ebapiisavalt keeruline, siis rÀÀgime nĂŒĂŒd deadlockidest. Ma ei tea, kes teist on nendega kokku puutunud. See on ĂŒsna levinud probleem andmebaasisĂŒsteemides. Deadlockid on olukord, kus ĂŒks sessioon ootab, et midagi teeks teine sessioon. Ja samal ajal ootab teine sessioon, et esimene sessioon teeks midagi.

Ja nĂ€iteks, kui Ivan ĂŒtleb: "Anna mulle midagi," aga mina ĂŒtlen: "Ei, ma annaksin sul seda ainult siis, kui sa annaksid mulle midagi muud." Ja ta ĂŒtleb: "Ei, ma ei anna sulle seda, kui sa ei anna mulle midagi." Ja me satume surnud ummikusse. Ma olen kindel, et Ivan seda ei tee, aga sa saad aru mĂ”ttest, et meil on kaks inimest, kes tahavad midagi saada ja nad ei ole valmis seda andma, kuni teine inimene neile ei anna, mida nad soovivad. Ja siin pole lahendust.

Ja tegelikult peab teie andmebaas selle tuvastama. Ja siis on vaja eemaldada vĂ”i sulgeda ĂŒks sessioon, sest vastasel juhul jÀÀvad nad sinna igaveseks. Ja me nĂ€eme seda andmebaasides, me nĂ€eme seda operatsioonisĂŒsteemides. Ja kĂ”igis kohtades, kus meil on paralleelsed protsessid, vĂ”ib see juhtuda.

Postgres lukuhalduri avamine. Bruce Momjian

Ja nĂŒĂŒd seame sisse kaks deadlocki. Seame ĂŒhe 50 ja teise 80. Esimeses reas teen uuenduse 50 pealt 50 peale. Mul tuleb transaktsiooni number 710.

Postgres lukuhalduri avamine. Bruce Momjian

Ja siis vahetan 80 81 vastu ja 50 51 vastu.

Postgres lukuhalduri avamine. Bruce Momjian

Ja nii see vÀlja nÀeb. SeetÔttu on 710 blokaadis rea, samas kui 711 ootab kinnitust. Me nÀgime seda, kui uuendame. 710 on meie rea omanik. Ja 711 ootab, kuni 710 lÔpetab transaktsiooni.

Postgres lukuhalduri avamine. Bruce Momjian

Ja isegi kirjutatakse, millises reas meil deadlock’id toimuvad. Ja siin hakkab see kummaliseks minema.

Postgres lukuhalduri avamine. Bruce Momjian

NĂŒĂŒd vĂ€rskendame 80 80 peale.

Postgres lukuhalduri avamine. Bruce Momjian

Ja siin hakkavad deadlock’id pihta. 710 ootab vastust 711-lt, samas kui 711 ootab 710-lt. Ja see ei lĂ”ppe hĂ€sti. Ainult ĂŒks tee on, et nad ootavad ĂŒksteiselt vastust.

Postgres lukuhalduri avamine. Bruce Momjian

See hakkab lihtsalt kÔike aeglustama. Ja me ei soovi seda.

Postgres lukuhalduri avamine. Bruce Momjian

Postgreses on viise, kuidas mĂ€rgata, kui see toimub. Ja kui see juhtub, saate sellise vea. Selge on see, et mingi protsess ootab SHARE LOCK’i teiselt protsessilt, st see, keda blokeerib protsess 711. Ja see protsess ootas SHARE LOCK’i teatud tehingu ID-le ja oli blokeeritud teise protsessi poolt. Seega oleme deadlock’i olukorras.

Postgres lukuhalduri avamine. Bruce Momjian

Kas on olemas ka kolmandat tĂŒĂŒpi deadlock’id? Kas see on vĂ”imalik? Jah.

Postgres lukuhalduri avamine. Bruce Momjian

Sisestame need numbrid tabelisse. Me muudame 40 40-ks, loome blokeeringu.

Postgres lukuhalduri avamine. Bruce Momjian

Muudame 60 61-ks, 80 81-ks.

Postgres lukuhalduri avamine. Bruce Momjian

Siis muudame 80, ja seejĂ€rel – bum!

Postgres lukuhalduri avamine. Bruce Momjian

Ja nĂŒĂŒd ootab 714 715 vastust. 716 ootab 715-d. Ja sellega ei saa enam midagi teha.

Postgres lukuhalduri avamine. Bruce Momjian

Siin ei ole enam kahte inimest, siin on juba kolm inimest. Ma tahan sinult midagi, see tahab midagi kolmandalt inimeselt, ja kolmas inimene tahab midagi minult. Ja me jÔuame kolmnurkse ootuse olukorda, sest kÔik ootame, et teine inimene lÔpetaks, mida ta peab tegema.

Postgres lukuhalduri avamine. Bruce Momjian

Ja Postgres teab, millisel real see toimub. SeetĂ”ttu annab ta teile jĂ€rgmise teate, mis nĂ€itab, et teil on probleem, kus kolm sisendit blokeerivad ĂŒksteist. Ja siin ei ole piiranguid. See vĂ”ib olla olukord, kus 20 kirjet blokeerivad ĂŒksteist.

Postgres lukuhalduri avamine. Bruce Momjian

JĂ€rgmine probleem on serialiseeritavus.

Postgres lukuhalduri avamine. Bruce Momjian

Kui on eriline serialiseeritavus blokeering.

Postgres lukuhalduri avamine. Bruce Momjian

Ja naaseme 719 juurde. Sellel on tÀiesti normaalne vÀljund.

Postgres lukuhalduri avamine. Bruce Momjian

Ja saate vajutada, et teostada transaction serialiseeritavuses.

Postgres lukuhalduri avamine. Bruce Momjian

Ja te mĂ”istate, et teil on nĂŒĂŒd teine ​​tĂŒĂŒp blokeeringut SA - see tĂ€hendab serialiseeritavat.

Postgres lukuhalduri avamine. Bruce Momjian

Postgres lukuhalduri avamine. Bruce Momjian

SeetĂ”ttu on meil uus tĂŒĂŒp blokeeringut, mida nimetatakse SARieadLock, mis on seerianumbrite blokeering ja vĂ”imaldab seerianumbrite sisestamist.

Postgres lukuhalduri avamine. Bruce Momjian

Samuti saate sisestada unikaalseid indekseid.

Postgres lukuhalduri avamine. Bruce Momjian

Selles tabelis on meil unikaalsed indekssid.

Postgres lukuhalduri avamine. Bruce Momjian

Seega, kui ma siia sisestan numbri 2, siis mul on 2. Kuid ĂŒlalpool sisestan veel ĂŒhe 2. Ja te nĂ€ete, et 721-l on ainulaadne lukustus. NĂŒĂŒd ootab 722, et 721 lĂ”petaks oma toimingu, kuna ta ei saa 2-d sisestada, enne kui ei tea, mis 721-ga juhtub.

Postgres lukuhalduri avamine. Bruce Momjian

Ja kui me teeme subtehingu.

Postgres lukuhalduri avamine. Bruce Momjian

Siin on meil 723.

Postgres lukuhalduri avamine. Bruce Momjian

Kui me salvestame punkti ja seejĂ€rel seda vĂ€rskendame, siis saame uue tehingu ID. See on veel ĂŒks kĂ€itumise iseloom, millest peate teadma. Kui me selle tagasi anname, siis tehingu ID kaob. 724 kaob. Kuid nĂŒĂŒd on meil 725.

Ja mida ma siin ĂŒritan teha? PĂŒĂŒan nĂ€idata teile nĂ€iteid ebatavalistest lukustustest, mida vĂ”ite leida: olgu need serialiseeritavad lukustused vĂ”i SAVEPOINT – need on erinevad lukustustĂŒĂŒbid, mis ilmuvad lukustuste tabelis.

Postgres lukuhalduri avamine. Bruce Momjian

See on eksplitsiitsete (selgete) lukustuste loomine, mille puhul on pg_advisory_lock.

Postgres lukuhalduri avamine. Bruce Momjian

Ja te nĂ€ete, et lukustuse tĂŒĂŒp on siin loetletud kui nĂ”uanne. Ja siin on punaselt kirjutatud "nĂ”uanne". Ja te vĂ”ite samaaegselt lukustada pg_advisory_unlockiga.

Postgres lukuhalduri avamine. Bruce Momjian

Ja lĂ”petuseks tahaksin teile nĂ€idata veel ĂŒht ĂŒllatavat asja. Loomin veel ĂŒhe vaate. Kuid ma ĂŒhendan tabeli pg_locks tabeliga pg_stat_activity. Ja miks ma seda teha tahan? Sest see vĂ”imaldab mul vaadata ja nĂ€ha kĂ”iki aktiivseid sessioone ning milliste lukustusde nad ootavad. See on ĂŒsna huvitav, kui meil on koos lukustus tabel ja pĂ€ringute tabel.

Postgres lukuhalduri avamine. Bruce Momjian

Ja siin loome pg_stat_view.

Postgres lukuhalduri avamine. Bruce Momjian

Ja vĂ€rskendame rida ĂŒhe vĂ”rra. Siin nĂ€eme 724. Ja siis vĂ€rskendame meie rida kolme vĂ”rra. Ja mida te siin nĂŒĂŒd nĂ€ete? Need on pĂ€ringud, st nĂ€ete kogu pĂ€ringute nimekirja, mis on loetletud vasakus veerus. Ja siis paremal poolel nĂ€ete lukustusi ja seda, mida nad loovad. Ja see vĂ”ib olla teile selgem, et te ei pea iga kord tagasi minema iga sessiooni juurde ja vaatama, kas sellele tuleks liituda vĂ”i mitte. Meie eest teevad seda.

Veel ĂŒks funktsioon, mis on vĂ€ga kasulik, on pg_blocking_pids. Te olete tĂ”enĂ€oliselt sellest kunagi kuulnud. Mida see teeb? See vĂ”imaldab meil öelda, milliseid protsesside ID-sid ootab seanss 11740. Ja te vĂ”ite nĂ€ha, et 11740 ootab 724. Ja 724 on kĂ”ige peal. Ja 11306 on teie protsesside ID. Sisuliselt lĂ€bib see funktsioon teie lukustustabelit. Ma tean, et see on veidi keeruline, kuid te suudate seda mĂ”ista. Sisuliselt lĂ€bib see funktsioon seda lukustustabelit ja pĂŒĂŒab leida, kus see protsessi ID asub, arvestades lukustusi, mida ta ootab. Ta ĂŒritab ka arvutada, milline protsesside ID on selle protsessi, mis ootab lukustust. SeetĂ”ttu vĂ”ite selle funktsiooni kĂ€ivitada. pg_blocking_pids.

Ja see osutub vÀga kasulikuks. Me lisasime selle alles versiooniga 9.6, seega on sellel funktsioonil vaid 5 aastat, aga see on vÀga ja vÀga kasulik. Sama kehtib ka teise pÀringu kohta. See nÀitab tÀpselt seda, mida me peame nÀgema.

Postgres lukuhalduri avamine. Bruce Momjian

See on see, millest ma tahtsin teiega rÀÀkida. Ja nagu ma ootasinki, kasutasime kogu meie aega, kuna slĂ€ide oli nii palju. Ja slĂ€ide on allalaadimiseks saadaval. Soovin tĂ€nada teid, et olite kohal. Olen kindel, et teile meeldib konverentsi ĂŒlejÀÀnud osa, suur aitĂ€h!

KĂŒsimused:

NĂ€iteks, kui ĂŒritan ridu uuendada, samal ajal kui teine sessioon pĂŒĂŒab kogu tabeli kustutada. Nii palju kui ma tean, peab seal olema midagi nagu intent lock. Kas see on olemas Postgreses?

Postgres lukuhalduri avamine. Bruce Momjian

KÀime tagasi algusesse. VÔib-olla mÀletate, et kui teete midagi, nÀiteks SELECT, siis laseme vÀlja AccessShareLock'i. Ja see takistab tabeli kustutamist. Seega, kui soovite nÀiteks uuendada rida tabelis vÔi kustutada rida, ei saa keegi samal ajal kogu tabelit kustutada, sest te hoiate selle AccessShareLock'i kogu tabeli ja rea kohal. Ja kui olete lÔpetanud, saavad nad selle kustutada. Kuid seni, kuni te seal midagi muudate, ei saa nad seda teha.

Teeme seda veel kord. Liigume kustutamise nĂ€ite juurde. Ja nĂ€ete, kuidas real on eksklusiivne lock kogu tabeli ĂŒle.

Kas see nÀeb vÀlja nagu eksklusiivne lukustus, eks?

Jah, see nĂ€eb tĂ”epoolest vĂ€lja nii. Ma saan aru, millest te rÀÀgite. Te ĂŒtlete, et kui ma teen SELECT-i, siis on mul jagatud eksklusiivne lukustus, ja kui ma muudan selle rida eksklusiivseks, kas see on probleem? Üllataval kombel ei tekita see probleemi. See on nagu lukustuse taseme tĂ”stmine, kuid pĂ”himĂ”tteliselt on mul lukustus, mis takistab kustutamist. Ja nĂŒĂŒd, kui ma teen selle lukustuse tugevamaks, siis takistab see endiselt kustutamist. Seega see ei tĂ€henda, et ma lĂ€heksin kĂ”rgemale. T. e. see takistas seda ka madalamal tasemel, seega, kui ma tĂ”stan taset, takistab see endiselt tabeli kustutamist.

Ma saan aru, millest te rÀÀgite. Siin ei ole lukustuse taseme tĂ”stmise juhtumit, kus ĂŒritate loobuda ĂŒhest lukustusest, et sisse viia tugevam. Siin toimub lihtsalt ĂŒleĂŒldine takistuse suurendamine, seega see ei tekita mingit konflikti. Kuid see on hea kĂŒsimus. Suur aitĂ€h, et kĂŒsisite!

Mida me peame tegema, et vÀltida deadlock olukorda, kui meil on palju sessioone ja suur hulk kasutajaid?

Postgres tuvastab automaatselt deadlock'i olukorrad ja eemaldab automaatselt ĂŒhe sessiooni. Ainus vĂ”imalus, mis aitab vĂ€ltida murtud lukustusi, on blokeerida inimesi samas jĂ€rjekorras. SeetĂ”ttu, kui vaatate oma rakendusele, siis sageli on deadlock'i pĂ”hjuseks
 Kujutame ette, et ma tahan blokeerida kahte erinevat asja. Üks rakendus blokeerib tabeli 1 ja teine rakendus blokeerib tabeli 2 ning seejĂ€rel tabeli 1. Ja kĂ”ige lihtsam viis deadlock'e vĂ€ltida on vaadata oma rakendusele ja tagada, et lukustus toimub kĂ”igis rakendustes sama jĂ€rjekorra jĂ€rgi. See eemaldab tavaliselt 80% probleemidest, sest erinevad inimesed kirjutavad neid rakendusi. Kui blokeerite need samas jĂ€rjekorras, siis ei puutu te kokku deadlock'i olukordadega.

Suur tÀnu teie ettekande eest! RÀÀkisite vacuum full'ist ja kui ma Ôigesti aru saan, siis vacuum full deformeerib kirje jÀrjekorda eraldi salvestuses, seega sÀilitavad praegused kirjed muutumatuna. Miks vacuum full aga vÔtab eksklusiivse lukustuse ja miks see konfliktib kirjutamisoperatsioonidega?

See on hea kĂŒsimus. PĂ”hjuseks on see, et vacuum full haarab tabeli. Ja me loome pĂ”himĂ”tteliselt uue versiooni tabelist. Tabel on seega uus. Saame, et see on tĂ€iesti uus versioon tabelist. Probleem on aga selles, et kui me seda teeme, ei taha me, et inimesed seda loeksid, kuna peame kindlustama, et nad nĂ€evad uut tabelit. Seega seondub see varasema kĂŒsimusega. Kui me saaksime samaaegselt lugeda, ei saaks me seda ĂŒmber paigutada ja suunata inimesi uuele tabelile. Me peaks ootama, kuni kĂ”ik lĂ”petavad selle tabeli lugemise, ja seetĂ”ttu on see pĂ”himĂ”tteliselt eksklusiivsete lukustuse olukord.
Me lihtsalt ĂŒtlem, et blokeerime algusest peale, kuna me teame, et lĂ”puks vajame eksklusiivset lukku, et kĂ”ik uuele koopiale ĂŒle viia. SeetĂ”ttu saame selle potentsiaalselt lubada. Ja me teeme seda samaaegse indekseerimisega. Kuid see on palju keerulisem. See on tugevalt seotud teie eelneva kĂŒsimusega eksklusiivse lukustuse kohta.

Kas on vĂ”imalik lisada locking timeout’i Postgresis? Oracle’is saan nĂ€iteks kirjutada 'vali uuendamiseks' ja oodata 50 sekundit enne uuendamist. See töötas hĂ€sti rakenduse jaoks. Kuid Postgresis pean seda kas tegema kohe ja mitte ĂŒldse ootama vĂ”i ootama mingi aja.

Jah, saate valida lukustuste, lockingute jaoks timeout’i. Samuti saate anda kĂ€su no way, mis 
, kui te ei saa kohe lukku. Seega on kas lock timeout vĂ”i midagi muud, mis lubab teil seda teha. Seda ei tehta sĂŒntaktilisel tasandil. See toimub serveri muutuja tasemel. MĂ”nikord ei saa seda kasutada.

Kas saate avada 75 slaidi?

Jah.

Postgres lukuhalduri avamine. Bruce Momjian

Ja minu jĂ€rgmine kĂŒsimus. Miks ootavad mĂ”lemad uuendamisprotsessid 703?

See on suurepĂ€rane kĂŒsimus. Ma ei saa aru, miks Postgres seda teeb. Kui 703 loodi, oodati 702. Ja kui 704 ja 705 ilmuvad, tundub, et nad ei tea, mida nad ootavad, sest seal pole veel midagi. Postgres teeb seda jĂ€rgmiste seaduste kohaselt: kui te ei saa lukku, ĂŒtleb ta: "Milleks teid ĂŒldse töötlema hakata?" sest te juba ootate kedagi. SeetĂ”ttu laseme tal lihtsalt Ă”hku jÀÀda, ta ei uuenda seda ĂŒldse. Aga mis siin juhtus? Niipea kui 702 lĂ”petas protsessi ja 703 sai oma lukustuse, naasis sĂŒsteem tagasi. Ja ĂŒtles, et nĂŒĂŒd on meid kaks, kes ootavad. Laseme neil seejĂ€rel ĂŒheskoos uuendada. Ja mĂ€rkime, et mĂ”lemad ootavad.

Ma ei tea, miks Postgres nii kĂ€itub. Kuid on probleem, mida nimetatakse f.... Minu arvates ei ole see vene termĂ­n. See juhtub, kui kĂ”ik ootavad ĂŒht lukku, isegi kui on 20 instantsi, kes ootavad lukku. Ja Ă€kki nad kĂ”ik Ă€rkavad korraga. Ja kĂ”ik hakkavad ĂŒritama reageerida. Kuid sĂŒsteem teeb nii, et kĂ”ik ootavad 703. Kuna nad kĂ”ik ootavad, paneme nad kohe jĂ€rjekorda. Ja kui ilmub mĂ”ni uus pĂ€ring, mis on tehtud pĂ€rast seda, nĂ€iteks 707, siis seal tuleb jĂ€lle tĂŒhjus.

Ja mulle tundub, et seda tehakse selleks, et saaks öelda, et sellel hetkel ootab 702 703, ja kÔik, kes tulevad pÀrast seda, ei saa mingit kirjet selles vÀljas. Kuid niipea, kui esimene ootaja lahkub, saavad kÔik, kes sel hetkel ootasid enne uuendust, sama mÀrgise. Ja seetÔttu arvan, et see on tehtud, et saaksime jÀrjest töödelda, et nad oleksid Ôigesti jÀrjekorras.

Olen alati vaadanud seda kui ĂŒsna kummalist nĂ€htust. Sest siin, nĂ€iteks, me ei loetle neid ĂŒldse. Kuid mulle tundub, et iga kord, kui anname uue lukustuse, vaatame kĂ”iki neid, kes ootamisprotsessis on. Siis joondame nad kĂ”ik jĂ€rjekorda. Ja siis pÀÀseb iga uus, kes saabub, jĂ€rjekorda alles siis, kui jĂ€rgmine inimene on lĂ”petanud. VĂ€ga hea kĂŒsimus. AitĂ€h teile kĂŒsimuse eest!

Mulle tundub, et on palju loogilisem, kui 705 ootab 704.

Kuid probleem on jĂ€rgmine. Tehniliselt saate Ă€ratada kas seda vĂ”i seda. Ja seetĂ”ttu Ă€ratame kas ĂŒhe vĂ”i teise. Aga mis toimub sĂŒsteemi töös? NĂ€ete, kuidas 703 ĂŒlal blokeeris oma tehingu ID. See on see, kuidas Postgres töötab. Ja 703 on blokeeritud oma tehingu ID tĂ”ttu, seega, kui keegi tahab oodata, siis ta ootab 703. Ja pĂ”himĂ”tteliselt lĂ”petab 703. Ja alles pĂ€rast selle lĂ”petamist Ă€ratatakse mĂ”ni protsess. Me ei tea, milline tĂ€pselt see protsess olema saab. SeejĂ€rel töötleme jĂ€rk-jĂ€rgult kĂ”ik. Kuid pole selge, milline protsess esimesena Ă€ratatakse, sest see vĂ”ib olla ĂŒkskĂ”ik milline neist protsessidest. PĂ”himĂ”tteliselt oli meil ajakava, mis ĂŒtles, et me vĂ”ime nĂŒĂŒd Ă€ratada ĂŒkskĂ”ik millise neist protsessidest. Me valime lihtsalt ĂŒhe juhuslikult. SeetĂ”ttu tuleb mĂ”lemad mĂ€rgistada, sest me vĂ”ime Ă€ratada ĂŒkskĂ”ik millise neist.

Probleem on selles, et meil on CP-lĂ”pmatus. SeetĂ”ttu on ĂŒsna tĂ”enĂ€oline, et saame Ă€ratada hilisema. Ja kui me nĂ€iteks Ă€ratame hilisema, siis me ootame seda, kes just sai lukustuse. SeetĂ”ttu me ei mÀÀra, kes esimesena Ă€ratatakse. Loome lihtsalt sellise olukorra ja sĂŒsteem Ă€ratab neid juhuslikus jĂ€rjekorras.

On Egor Rogovi lukustusartiklid. Vaadake, need on samuti huvitavad ja kasulikud. Teema on muidugi ulme keeruline. Suur tÀnu, Bruce!

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster