Spär de Postgres Lock Manager op. Bruce Momjian

Transkript vum Bruce Momjian sengem 2020 Gespréich "De Postgres Lock Manager opmaachen".

Spär de Postgres Lock Manager op. Bruce Momjian

(Notiz: All SQL Ufroen aus de Rutschen kënnen aus dësem Link kritt ginn: http://momjian.us/main/writings/pgsql/locking.sql)

Hallo! Et ass flott erëm hei a Russland ze sinn. Et deet mir leed, ech konnt d'lescht Joer net kommen, awer dëst Joer hunn den Ivan an ech grouss Pläng. Ech hoffen hei vill méi oft ze sinn. Ech Léift zu Russland kommen. Ech wäert Tyumen, Tver besichen. Ech si ganz frou, datt ech dës Stied besichen wäert.

Mäin Numm ass Bruce Momjian. Ech schaffen bei EnterpriseDB a schaffe mat Postgres fir iwwer 23 Joer. Ech liewen zu Philadelphia, USA. Ech reesen ongeféier 90 Deeg am Joer. An ech besichen ongeféier 40 Konferenzen. Meng Websäit, déi d'Rutschen enthält, déi ech Iech elo weisen. Dofir, no der Konferenz, kënnt Dir se vu menger perséinlecher Websäit eroflueden. Et enthält och ongeféier 30 Presentatiounen. Et ginn och Videoen an eng grouss Zuel vu Blog Entréen, méi wéi 500. Dëst ass eng zimlech informativ Ressource. A wann Dir un dësem Material interesséiert sidd, dann invitéieren ech Iech et ze benotzen.

Ech war fréier Enseignant, e Professer ier ech ugefaang hunn mat Postgres ze schaffen. An ech si ganz frou, datt ech Iech elo kënnen soen, wat ech Iech elo soen. Dëst ass eng vu mengen interessantsten Presentatiounen. An dës Presentatioun enthält 110 Rutschen. Mir fänken un mat einfache Saachen ze schwätzen, an um Enn wäert de Bericht ëmmer méi komplex ginn a ganz komplex ginn.

Spär de Postgres Lock Manager op. Bruce Momjian

Dëst ass en zimlech onsympathesche Gespréich. Blockéieren ass net dat populärste Thema. Mir wëllen dat iergendwou verschwannen. Et ass wéi bei den Zänndokter ze goen.

Spär de Postgres Lock Manager op. Bruce Momjian

  1. Sperren ass e Problem fir vill Leit déi an Datenbanken schaffen a verschidde Prozesser zur selwechter Zäit lafen. Si brauche Blockéierung. Dat ass, haut ginn ech Iech Basiswëssen iwwer Blockéieren.
  2. Transaktioun IDen. Dëst ass en zimlech langweilegen Deel vun der Presentatioun, awer se musse verstane ginn.
  3. Als nächst wäerte mir iwwer Aarte vu Blockéierung schwätzen. Dëst ass eng zimlech mechanesch Deel.
  4. An hei ënnen wäerte mir e puer Beispiller vu Blockéierung ginn. An et wäert ganz schwéier sinn ze verstoen.

Spär de Postgres Lock Manager op. Bruce Momjian

Loosst eis iwwer Spär schwätzen.

Spär de Postgres Lock Manager op. Bruce Momjian

Eis Terminologie ass zimlech komplex. Wéi vill vun iech wësse wou dëse Passage hierkënnt? Zwee Leit. Dëst ass aus engem Spill mam Numm Colossal Cave Adventure. Et war en Textbaséiert Computerspill an den 80er, mengen ech. Do misst een an eng Höhl, an e Labyrinth goen, an den Text huet sech geännert, mee den Inhalt war all Kéier ongeféier d'selwecht. Dat ass wéi ech dëst Spill erënneren.

Spär de Postgres Lock Manager op. Bruce Momjian

An hei gesi mer den Numm vun de Schleisen, déi vun Oracle bei eis komm sinn. Mir benotzen se.

Spär de Postgres Lock Manager op. Bruce Momjian

Hei gesi mir Begrëffer déi mech duercherneen bréngen. Zum Beispill SHARE UPDATE ECXLUSIVE. Nächst DEEL RAW ECXLUSIVE. Fir éierlech ze sinn, sinn dës Nimm net ganz kloer. Mir probéieren se méi am Detail ze betruechten. E puer enthalen d'Wuert "deelen", dat heescht trennen. E puer enthalen d'Wuert "exklusiv". E puer enthalen béid vun dëse Wierder. Ech géif gären ufänken mat wéi dës Schleisen funktionnéieren.

Spär de Postgres Lock Manager op. Bruce Momjian

An d'Wuert "Zougang" ass och ganz wichteg. An d'Wierder "Rei" sinn eng String. Dat ass, Zougang Verdeelung, Rei Verdeelung.

Spär de Postgres Lock Manager op. Bruce Momjian

E weideren Thema, deen am Postgres muss verstane ginn, wat ech leider net a mengem Gespréich ka beschäftegen, ass MVCC. Ech hunn eng separat Presentatioun iwwer dëst Thema op menger Websäit. A wann Dir mengt datt dës Presentatioun schwéier ass, ass MVCC wahrscheinlech meng haardsten. A wann Dir interesséiert sidd, kënnt Dir et op der Websäit kucken. Dir kënnt de Video kucken.

Spär de Postgres Lock Manager op. Bruce Momjian

Eng aner Saach déi mir musse verstoen ass Transaktiouns-IDen. Vill Transaktioune kënnen net ouni eenzegaarteg Identifizéierer funktionnéieren. An hei hu mir eng Erklärung wat eng Transaktioun ass. Postgres huet zwee Transaktiounsnummersystemer. Ech weess, datt dëst net eng ganz schéin Léisung ass.

Spär de Postgres Lock Manager op. Bruce Momjian

Denkt och drun datt d'Rutschen zimmlech schwéier ze verstoen sinn, also wat rout markéiert ass wat Dir oppassen musst.

Spär de Postgres Lock Manager op. Bruce Momjian

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

Mol kucken. D'Transaktiounsnummer ass rout markéiert. D'SELECT pg_back Funktioun gëtt hei gewisen. Et gëtt meng Transaktioun an d'Transaktiouns-ID zréck.

Eng méi Saach, wann Dir dës Presentatioun gär hutt a se op Ärer Datebank wëllt lafen, da kënnt Dir op dëse Link a rosa goen an d'SQL fir dës Presentatioun eroflueden. An Dir kënnt et einfach an Ärem PSQL lafen an déi ganz Presentatioun wäert direkt op Ärem Écran sinn. Et wäert keng Blummen enthalen, awer op d'mannst kënne mir et gesinn.

Spär de Postgres Lock Manager op. Bruce Momjian

An dësem Fall gesi mir d'Transaktioun ID. Dëst ass d'Nummer déi mir hir zougewisen hunn. An et gëtt eng aner Aart vun Transaktiouns-ID an Postgres, déi virtuell Transaktiouns-ID genannt gëtt

A mir mussen dat verstoen. Dëst ass ganz wichteg, soss wäerte mir net fäeg sinn d'Spär am Postgres ze verstoen.

Eng virtuell Transaktiouns-ID ass eng Transaktiouns-ID déi keng persistent Wäerter enthält. Zum Beispill, wann ech e SELECT Kommando lafen, da wäert ech héchstwahrscheinlech d'Datebank net änneren, ech spären näischt. Also wa mir en einfachen SELECT lafen, gi mir dës Transaktioun keng persistent ID. Mir ginn hir nëmmen eng virtuell ID do.

An dëst verbessert d'Performance vun Postgres, verbessert d'Botzenfäegkeeten, sou datt déi virtuell Transaktiouns-ID aus zwou Zuelen besteet. Déi éischt Nummer virum Slash ass d'Backend ID. A riets gesi mer just e Konter.

Spär de Postgres Lock Manager op. Bruce Momjian

Dofir, wann ech eng Ufro lafen, seet et datt d'Backend ID 2 ass.

Spär de Postgres Lock Manager op. Bruce Momjian

A wann ech eng Serie vun esou Transaktiounen lafen, da gesi mir datt de Konter all Kéier wann ech eng Ufro lafen. Zum Beispill, wann ech d'Ufro lafen 2/10, 2/11, 2/12, etc.

Spär de Postgres Lock Manager op. Bruce Momjian

Denkt drun datt et zwou Kolonnen hei sinn. Op der lénkser Säit gesi mir déi virtuell Transaktioun ID - 2/12. An op der rietser hu mir eng permanent Transaktioun ID. An dëst Feld ass eidel. An dës Transaktioun ännert d'Datebank net. Also ech ginn et keng permanent Transaktiouns-ID.

Spär de Postgres Lock Manager op. Bruce Momjian

Soubal ech d'Analyse Kommando lafen ((ANALYZE)), gëtt déi selwecht Ufro mech eng permanent Transaktioun ID. Kuckt wéi dëst fir eis geännert huet. Ech hunn dës ID net virdrun, awer elo hunn ech et.

Spär de Postgres Lock Manager op. Bruce Momjian

Also hei ass eng aner Ufro, eng aner Transaktioun. Déi virtuell Transaktiounsnummer ass 2/13. A wann ech no enger persistent Transaktiouns-ID froen, dann wann ech d'Ufro lafen, kréien ech et.

Spär de Postgres Lock Manager op. Bruce Momjian

Also, nach eng Kéier. Mir hunn eng virtuell Transaktioun ID an eng persistent Transaktioun ID. Verstinn just dëse Punkt fir Postgres Verhalen ze verstoen.

Spär de Postgres Lock Manager op. Bruce Momjian

Mir ginn op déi drëtt Sektioun. Hei wäerte mir einfach duerch déi verschidden Zorte vu Schleisen zu Postgres Spadséiergank. Et ass net ganz interessant. Déi lescht Sektioun wäert vill méi interessant sinn. Mä mir mussen d'Basis Saache berücksichtegen, well soss verstinn mir net wat duerno geschitt.

Mir ginn duerch dës Rubrik, mir kucken op all Zort Spär. An ech weisen Iech Beispiller vu wéi se installéiert sinn, wéi se funktionnéieren, ech weisen Iech e puer Ufroen déi Dir benotze kënnt fir ze kucken wéi d'Sperre funktionnéiert am Postgres.

Spär de Postgres Lock Manager op. Bruce Momjian

Fir eng Ufro ze kreéieren an ze kucken wat an Postgres geschitt, musse mir d'Ufro an der Systemvisioun erausginn. An dësem Fall gëtt pg_lock rout markéiert. Pg_lock ass e Systemtabel deen eis erzielt wat Spären am Moment am Postgres benotzt ginn.

Wéi och ëmmer, et ass ganz schwéier fir mech Iech pg_lock eleng ze weisen well et zimlech komplex ass. Also hunn ech eng Vue erstallt déi pg_locks weist. An et mécht och e puer Aarbecht fir mech, déi et erlaabt mech besser ze verstoen. Dat ass, et schléisst meng Spären, meng eegen Sessioun, etc.. Et ass just Standard SQL an et erlaabt Iech besser ze weisen wat lass ass.

Spär de Postgres Lock Manager op. Bruce Momjian

En anere Problem ass datt dës Vue ganz breet ass, also muss ech eng zweet erstellen - lockview2.

Spär de Postgres Lock Manager op. Bruce Momjian An et weist mir méi Kolonnen aus der Tabell. An en aneren deen mir de Rescht vun de Sailen weist. Dëst ass zimlech komplex, also hunn ech probéiert et sou einfach wéi méiglech ze presentéieren.

Spär de Postgres Lock Manager op. Bruce Momjian

Also hu mir en Dësch mam Numm Lockdemo erstallt. A mir hunn do eng Zeil geschaf. Dëst ass eise Beispill Dësch. A mir erstellen Rubriken just fir Iech Beispiller vu Schleisen ze weisen.

Spär de Postgres Lock Manager op. Bruce Momjian

Also, eng Zeil, eng Kolonn. Déi éischt Zort Spär gëtt ZOUGANG SHARE genannt. Dëst ass déi mannst restriktiv Blockéierung. Dëst bedeit datt et praktesch net mat anere Schleisen ass.

A wa mir e Spär explizit definéieren wëllen, lafe mir de Kommando "Spär Dësch". An et wäert selbstverständlech blockéieren, dh am ACCESS SHARE Modus lancéiere mir de Spär Dësch. A wann ech PSQL am Hannergrond lafen, da fänken ech déi zweet Sessioun vu menger éischter Sessioun esou un. Dat ass, wat wäert ech hei maachen? Ech ginn op eng aner Sessioun a soen et "weist mir de Lockview fir dës Ufro." An hei hunn ech AccessShareLock an dëser Tabell. Dat ass genee wat ech gefrot hunn. An hie seet datt de Block zougewisen ass. Ganz einfach.

Spär de Postgres Lock Manager op. Bruce Momjian

Weider, wa mir déi zweet Kolonn kucken, da gëtt et näischt do. Si sinn eidel.

Spär de Postgres Lock Manager op. Bruce Momjian

A wann ech de Kommando "SELECT" lafen, dann ass dëst den impliziten (explizit) Wee fir AccessShareLock ze froen. Also ech befreien meng Tabell a lafen d'Ufro an d'Ufro gëtt méi Reihen zréck. An an enger vun de Linnen gesi mir AccessShareLock. Also, SELECT rifft AccessShareLock um Dësch. An et ass net am Konflikt mat quasi näischt, well et e Low-Level-Schloss ass.

Spär de Postgres Lock Manager op. Bruce Momjian

Wat wann ech e SELECT lafen an dräi verschidden Dëscher hunn? Virdrun hunn ech nëmmen een Dësch lafen, elo lafen ech dräi: pg_class, pg_namespace an pg_attribute.

Spär de Postgres Lock Manager op. Bruce Momjian

An elo wann ech d'Ufro kucken, gesinn ech 9 AccessShareLocks an dräi Dëscher. Firwat? Dräi Dëscher sinn blo markéiert: pg_attribute, pg_class, pg_namespace. Awer Dir kënnt och gesinn datt all Indizes déi duerch dës Dëscher definéiert sinn och AccessShareLock hunn.

An dëst ass e Spär, dee praktesch net mat anere Konflikt ass. An alles wat et mécht ass einfach ze verhënneren datt mir den Dësch zrécksetzen wärend mir en auswielen. Et mécht Sënn. Dat heescht, wa mir en Dësch auswielen, da verschwënnt en dee Moment, dann ass dat falsch, also AccessShare ass en nidderegen Niveau Spär deen eis seet "dësen Dësch net falen wann ech schaffen". Wesentlech ass dat alles wat hatt mécht.

Spär de Postgres Lock Manager op. Bruce Momjian

ROW SHARE - Dëse Spär ass e bëssen anescht.

Spär de Postgres Lock Manager op. Bruce Momjian

Loosst eis e Beispill huelen. SELECT ROW SHARE Method fir all Zeil individuell ze spären. Op dës Manéier kann keen se läschen oder änneren wärend mir se kucken.

Spär de Postgres Lock Manager op. Bruce MomjianAlso wat mécht SHARE LOCK? Mir gesinn datt d'Transaktiouns-ID 681 fir SELECT ass. An dëst ass interessant. Wat ass hei geschitt? Déi éischte Kéier datt mir d'Zuel gesinn ass am Feld "Spär". Mir huelen d'Transaktiouns-ID an et seet et blockéiert se am exklusive Modus. Alles wat et mécht ass et seet datt ech eng Rei hunn déi technesch iergendwou an der Tabell gespaart ass. Mee hie seet net wou genau. Mir wäerten dëst e bësse méi spéit méi am Detail kucken.

Spär de Postgres Lock Manager op. Bruce Momjian

Hei soen mir datt d'Schloss vun eis benotzt gëtt.

Spär de Postgres Lock Manager op. Bruce Momjian

Also, en exklusive Spär seet explizit datt et exklusiv ass. An och wann Dir eng Zeil an dëser Tabell läscht, dann ass dat wat geschitt, wéi Dir gesitt.

Spär de Postgres Lock Manager op. Bruce Momjian

EXKLUSIV SHARE ass e méi laang Spär.

Spär de Postgres Lock Manager op. Bruce Momjian

Dëst ass den (ANALYZE) Analyser Kommando deen benotzt gëtt.

Spär de Postgres Lock Manager op. Bruce Momjian

SHARE LOCK - Dir kënnt explizit am Deelemodus spären.

Spär de Postgres Lock Manager op. Bruce Momjian

Dir kënnt och en eenzegaartegen Index erstellen. An do gesitt Dir SHARE LOCK, wat en Deel vun hinnen ass. An et gespaart den Dësch a setzt e SHARE LOCK op.

Par défaut, SHARE LOCK op engem Dësch bedeit datt aner Leit den Dësch liesen kënnen, awer keen kann et änneren. An dat ass genau wat geschitt wann Dir en eenzegaartegen Index erstellt.

Wann ech en eenzegaartege gläichzäiteg Index erstellen, da wäert ech eng aner Aart vu Sperrung hunn, well, wéi Dir Iech erënnert, d'Benotzung vun gläichzäiteg Indexen d'Spärfuerderung reduzéiert. A wann ech en normalen Spär benotzen, en normalen Index, da verhënnert ech domat ze schreiwen an den Tabellindex wärend en erstallt gëtt. Wann ech e gläichzäiteg Index benotzen, da muss ech eng aner Zort Sperrung benotzen.

Spär de Postgres Lock Manager op. Bruce Momjian

SHARE ROW EXKLUSIV - erëm kann et explizit (explizit) gesat ginn.

Spär de Postgres Lock Manager op. Bruce Momjian

Oder mir kënnen eng Regel erstellen, dh e spezifesche Fall huelen an deem se benotzt gëtt.

Spär de Postgres Lock Manager op. Bruce Momjian

EXKLUSIV Spär heescht, datt keen aneren den Dësch änneren kann.

Spär de Postgres Lock Manager op. Bruce Momjian

Hei gesi mir verschidden Zorte vu Schleisen.

Spär de Postgres Lock Manager op. Bruce Momjian

ACCESS EXCLUSIVE, zum Beispill, ass e Spärkommando. Zum Beispill, wann Dir CLUSTER table, da wäert dat bedeiten, datt keen do schreiwen kann. An et gespaart net nëmmen den Dësch selwer, awer och d'Indexen.

Spär de Postgres Lock Manager op. Bruce Momjian

Dëst ass déi zweet Säit vun der ACCESS EXCLUSIVE Blocking, wou mir genau gesinn wat et an der Tabell blockéiert. Et gespaart eenzel Dësch Reihen, déi ganz interessant ass.

Dat ass all d'Basisinformatioun déi ech wollt ginn. Mir hunn iwwer Spären geschwat, iwwer Transaktiouns-IDen, iwwer virtuell Transaktiouns-IDen, iwwer permanent Transaktiouns-IDen.

Spär de Postgres Lock Manager op. Bruce Momjian

An elo wäerte mir duerch e puer blockéieren Beispiller goen. Dëst ass déi interessantst Deel. Mir wäerten op ganz interessant Fäll kucken. A mäi Zil an dëser Presentatioun ass Iech e bessert Verständnis ze ginn wat Postgres tatsächlech mécht wann et probéiert verschidde Saachen ze blockéieren. Ech mengen hien ass ganz gutt Deeler ze blockéieren.

Loosst eis e puer spezifesch Beispiller kucken.

Spär de Postgres Lock Manager op. Bruce Momjian

Mir fänken un mat Dëscher an enger Zeil an enger Tabell. Wann ech eppes aginn hunn ech ExclusiveLock, Transaktiouns-ID an ExclusiveLock um Dësch ugewisen.

Spär de Postgres Lock Manager op. Bruce Momjian

Wat geschitt wann ech zwou méi Zeilen aginn? An elo huet eisen Dësch dräi Reihen. An ech hunn eng Zeil agebaut an hunn dëst als Ausgang kritt. A wann ech nach zwou Reihen setzen, wat ass komesch doriwwer? Et gëtt eng komesch Saach hei well ech dräi Zeile zu dësem Dësch dobäi hunn, mee ech hunn nach zwou Zeile an der Spär Dësch. An dëst ass am Fong dat fundamentalt Verhalen vu Postgres.

Vill Leit mengen datt wann Dir an enger Datebank 100 Zeilen gespaart hutt, da musst Dir 100 gespaarten Entréen erstellen. Wann ech 1 Reihen op eemol blockéieren, da brauch ech 000 esou Ufroen. A wann ech eng Millioun oder eng Milliard brauch fir ze blockéieren. Awer wa mir dat maachen, funktionnéiert et net ganz gutt. Wann Dir e System benotzt hutt, deen Spärentrée fir all eenzel Zeil erstellt, da kënnt Dir gesinn datt dëst komplizéiert ass. Well Dir musst direkt e Spär Dësch definéieren déi iwwerflësseg kann, awer Postgres mécht dat net.

A wat wierklech wichteg ass iwwer dës Rutsch ass datt et kloer weist datt et en anere System gëtt deen am MVCC leeft deen eenzel Reihen gespaart. Also wann Dir Milliarden Reihen gespaart hutt, erstellt Postgres keng Milliard separat Sperrbefehl. An dat huet e ganz gudden Effekt op d'Produktivitéit.

Spär de Postgres Lock Manager op. Bruce Momjian

Wat iwwer en Update? Ech update der Rei elo, an Dir kënnt gesinn, datt et zwou verschidden Operatiounen op eemol gemaach huet. Et huet den Dësch gläichzäiteg gespaart, awer och den Index gespaart. An hien huet missen den Index spären well et eenzegaarteg Aschränkungen op dësem Dësch sinn. A mir wëllen dofir suergen, datt keen et ännert, also blockéiere mir et.

Spär de Postgres Lock Manager op. Bruce Momjian

Wat geschitt wann ech zwou Zeile aktualiséieren wëll? A mir gesinn, datt hien déi selwecht Manéier behuelen. Mir maachen duebel sou vill Aktualiséierungen, mä genee déi selwecht Zuel vun Spär Linnen.

Wann Dir Iech frot wéi Postgres dëst mécht, musst Dir meng Gespréicher iwwer MVCC lauschteren fir ze léieren wéi Postgres intern dës Linnen markéiert datt et ännert. An Postgres huet e Wee wéi et dëst mécht, awer et mécht et net um Dësch Spärniveau, et mécht et op engem nidderegen a méi effizienten Niveau.

Spär de Postgres Lock Manager op. Bruce Momjian

Wat wann ech eppes läschen wëll? Wann ech läschen, zum Beispill, eng Zeil an ech hunn nach ëmmer meng zwee Spär-Inputen, an och wann ech se all läschen wëll, sinn se nach ëmmer do.

Spär de Postgres Lock Manager op. Bruce Momjian

An ech wëll zum Beispill 1 Zeilen asetzen, an dann entweder 000 Zeilen läschen oder derbäisetzen, dann déi eenzel Zeilen, déi ech addéieren oder änneren, déi ginn hei net opgeholl. Si sinn op engem nidderegen Niveau bannent der Serie selwer geschriwwen. A während der MVCC Ried hunn ech doriwwer am Detail geschwat. Awer et ass ganz wichteg wann Dir Spären analyséiert fir sécher ze sinn datt Dir um Dëschniveau gespaart sidd an datt Dir net gesitt wéi eenzel Reihen hei opgeholl ginn.

Spär de Postgres Lock Manager op. Bruce Momjian

Wat iwwer explizit Blockéierung?

Spär de Postgres Lock Manager op. Bruce Momjian

Wann ech op refresh klickt, hunn ech zwou Reihen gespaart. A wann ech se all auswielen a klickt "iwwerall aktualiséieren", dann hunn ech nach ëmmer zwee Spärrecords.

Spär de Postgres Lock Manager op. Bruce Momjian

Mir erstellen keng separat records fir all eenzel Zeil. Well dann fällt d'Produktivitéit erof, et kann ze vill dovu sinn. A mir kënnen eis an enger désagréabel Situatioun fannen.

Spär de Postgres Lock Manager op. Bruce Momjian

An datselwecht, wa mir gedeelt hunn, kënne mir alles 30 Mol maachen.

Spär de Postgres Lock Manager op. Bruce Momjian

Mir restauréieren eisen Dësch, läschen alles, setzen dann nach eng Zeil an.

Spär de Postgres Lock Manager op. Bruce Momjian

En anert Verhalen dat Dir am Postgres gesitt dat ganz bekannt ass a gewënschte Verhalen ass datt Dir en Update oder e Choix maache kënnt. An Dir kënnt dat gläichzäiteg maachen. A wielt blockéiert net Update an datselwecht an der entgéintgesate Richtung. Mir soen dem Lieser de Schrëftsteller net ze blockéieren, an de Schrëftsteller huet de Lieser net blockéiert.

Ech weisen Iech e Beispill vun dësem. Ech wäert elo e Choix maachen. Mir maachen dann den INSERT. An da kënnt Dir gesinn - 694. Dir kënnt d'ID vun der Transaktioun gesinn, déi dës Insertioun gemaach huet. An esou funktionnéiert et.

Spär de Postgres Lock Manager op. Bruce Momjian

A wann ech elo meng Backend ID kucken, ass et elo 695.

Spär de Postgres Lock Manager op. Bruce Momjian

An ech gesinn 695 a mengem Dësch erschéngen.

Spär de Postgres Lock Manager op. Bruce Momjian

A wann ech hei esou aktualiséieren, da kréien ech en anere Fall. An dësem Fall ass 695 en exklusive Spär, an d'Aktualiséierung huet datselwecht Verhalen, awer et gëtt kee Konflikt tëscht hinnen, wat ganz ongewéinlech ass.

An Dir kënnt gesinn datt uewen et ShareLock ass, an ënnen ass et ExclusiveLock. A béid Transaktiounen hunn geklappt.

An Dir musst mäi Gespréich um MVCC lauschteren fir ze verstoen wéi dëst geschitt. Awer dëst ass eng Illustratioun datt Dir et zur selwechter Zäit maache kënnt, dh e SELECT an en UPDATE zur selwechter Zäit maachen.

Spär de Postgres Lock Manager op. Bruce Momjian

Loosst eis zrécksetzen an nach eng Operatioun maachen.

Spär de Postgres Lock Manager op. Bruce Momjian

Wann Dir probéiert zwee Updates gläichzäiteg op der selwechter Zeil ze lafen, gëtt se blockéiert. An denkt drun, ech hunn gesot datt de Lieser de Schrëftsteller net blockéiert, an de Schrëftsteller blockéiert de Lieser net, awer ee Schrëftsteller blockéiert en anere Schrëftsteller. Dat ass, mir kënnen net zwee Leit déi selwecht Zeil gläichzäiteg aktualiséieren. Dir musst waarden bis ee vun hinnen fäerdeg ass.

Spär de Postgres Lock Manager op. Bruce Momjian

A fir dat ze illustréieren, kucken ech de Lockdemo Dësch. A mir kucken op eng Rei. Pro Transaktioun 698.

Mir hunn dëst op 2 aktualiséiert. 699 ass den éischten Update. An et war erfollegräich oder et ass an enger pending Transaktioun a waart op eis fir ze bestätegen oder ze annuléieren.

Spär de Postgres Lock Manager op. Bruce Momjian

Awer kuckt eppes anescht - 2/51 ass eis éischt Transaktioun, eis éischt Sessioun. 3/112 ass déi zweet Ufro, déi vun der Spëtzt koum, déi dee Wäert op 3 geännert huet. A wann Dir bemierkt, huet déi Top sech selwer gespaart, dat ass 699. Mee 3/112 huet d'Schloss net zouginn. D'Lock_mode Kolonn seet op wat et waart. Et erwaart 699. A wann Dir kuckt wou 699 ass, ass et méi héich. A wat huet déi éischt Sessioun gemaach? Si huet en exklusive Spär op hir eegen Transaktiouns-ID erstallt. Dëst ass wéi Postgres et mécht. Et blockéiert seng eege Transaktiouns-ID. A wann Dir wëllt op een waarden fir ze bestätegen oder ze annuléieren, da musst Dir waarden wann et eng Transaktioun ass. An dofir gesi mir eng komesch Linn.

Loosst eis nach eng Kéier kucken. Op der lénkser Säit gesi mir eis Veraarbechtungs-ID. An der zweeter Kolonn gesi mir eis virtuell Transaktioun ID, an an der drëtter gesinn mir lock_type. Wat heescht dat? Wesentlech wat et seet ass datt et d'Transaktiouns-ID blockéiert. Awer bemierkt datt all d'Reihen um ënnen Relatioun soen. An esou hutt Dir zwou Zorte vu Schleisen op den Dësch. Et gëtt eng Relatioun Spär. An da gëtt et d'Transaktiounsid-Blockéierung, wou Dir eleng blockéiert, dat ass genau wat geschitt op der éischter Zeil oder ganz ënnen, wou d'Transaktiounsid ass, wou mir waarden op 699 fir seng Operatioun ofzeschléissen.

Ech kucken wat hei geschitt. An hei geschéien zwou Saache gläichzäiteg. Dir sicht eng Transaktioun ID Spär an der éischter Zeil, déi sech selwer gespaart. A si blockéiert sech fir d'Leit ze waarden.

Wann Dir op déi 6. Zeil kuckt, ass et déiselwecht Entrée wéi déi éischt. An dofir ass Transaktioun 699 blockéiert. 700 ass och selbstverständlech. An dann an der ënneschter Zeil gesitt Dir datt mir op 699 waarden fir seng Operatioun fäerdeg ze maachen.

Spär de Postgres Lock Manager op. Bruce Momjian

An am lock_type, tuple gesitt Dir Zuelen.

Spär de Postgres Lock Manager op. Bruce Momjian

Dir kënnt gesinn et ass 0/10. An dëst ass d'Säitnummer, an och d'Offset vun dëser spezieller Zeil.

Spär de Postgres Lock Manager op. Bruce Momjian

An Dir gesitt et gëtt 0/11 wann mir update.

Spär de Postgres Lock Manager op. Bruce Momjian

Awer a Wierklechkeet ass et 0/10, well et gëtt eng Waarde fir dës Operatioun. Mir hunn d'Méiglechkeet ze gesinn, datt dëst d'Serie ass, déi ech waarden fir ze bestätegen.

Spär de Postgres Lock Manager op. Bruce Momjian

Wann mir et bestätegt hunn an dréckt engagéieren, a wann den Update fäerdeg ass, ass dat wat mir erëm kréien. Transaktioun 700 ass déi eenzeg Spär, et wait net fir en aneren well et engagéiert gouf. Et waart einfach op d'Transaktioun fir ze kompletéieren. Wann 699 aus ass, waarden mir op näischt méi. An elo Transaktioun 700 seet, datt alles gutt ass, datt et all Spären huet et op all erlaabt Dëscher brauch.

Spär de Postgres Lock Manager op. Bruce Momjian

A fir dat Ganzt nach méi komplizéiert ze maachen, kreéiere mir eng aner Vue, déi eis dës Kéier eng Hierarchie gëtt. Ech erwaarden net datt Dir dës Ufro versteet. Awer dëst wäert eis eng méi kloer Vue op wat leeft.

Spär de Postgres Lock Manager op. Bruce Momjian

Dëst ass eng rekursiv Vue déi och eng aner Sektioun huet. An da bréngt et alles erëm zesummen. Loosst eis dëst benotzen.

Spär de Postgres Lock Manager op. Bruce Momjian

Wat wa mir dräi simultan Updates maachen a soen datt d'Zeil elo dräi ass. A mir änneren 3 op 4.

Spär de Postgres Lock Manager op. Bruce Momjian

An hei gesi mer 4. An Transaktioun ID 702.

Spär de Postgres Lock Manager op. Bruce Momjian

An dann änneren ech 4 op 5. A 5 op 6, a 6 op 7. An ech wäert eng Rei vu Leit opstellen, déi op dës Transaktioun waarden bis Enn.

Spär de Postgres Lock Manager op. Bruce Momjian

An alles gëtt kloer. Wat ass déi éischt Zeil? Dëst ass 702. Dëst ass d'Transaktiouns-ID déi ursprénglech dëse Wäert festgeluecht huet. Wat ass a menger Granted Kolonn geschriwwen? Ech hunn Marken f. Dëst sinn meng Aktualiséierungen déi (5, 6, 7) net guttgeheescht kënne ginn, well mir waarden op d'Transaktiouns-ID 702 op en Enn. Do hu mir Transaktiouns-ID-Blockéierung. An dëst féiert zu 5 Transaktiouns-ID-Spären.

A wann Dir op 704 kuckt, op 705, ass do nach näischt geschriwwe ginn, well se wëssen nach net wat lass ass. Si schreiwen einfach datt si keng Ahnung hunn wat geschitt. A si wäerte just schlofen, well se op een waarden fir fäerdeg ze ginn an erwächt ze ginn wann et eng Geleeënheet ass fir Reihen z'änneren.

Spär de Postgres Lock Manager op. Bruce Momjian

Dëst ass wéi et ausgesäit. Et ass kloer datt se all op déi 12. Linn waarden.

Spär de Postgres Lock Manager op. Bruce Momjian

Dëst ass wat mir hei gesinn hunn. Hei ass 0/12.

Spär de Postgres Lock Manager op. Bruce Momjian

Also wann déi éischt Transaktioun guttgeheescht ass, kënnt Dir hei gesinn wéi d'Hierarchie funktionnéiert. An elo gëtt alles kloer. Si ginn all propper. A si waarden eigentlech nach.

Spär de Postgres Lock Manager op. Bruce Momjian

Hei ass wat geschitt. 702 engagéiert. An elo 703 kritt dës Rei Spär, an dann fänkt 704 fir 703 ze engagéieren waarden. An de 705 waart och drop. A wann dat alles fäerdeg ass, botzen se sech selwer. An ech wëll drop hiweisen, datt jidderee sech op d'Linn stellt. An dat ass ganz ähnlech wéi eng Situatioun an engem Stau, wann jiddereen op den éischten Auto waart. Den éischten Auto stoppt a jidderee steet an enger laanger Linn op. Da beweegt et, da kann den nächsten Auto no vir fueren a säi Block kréien, asw.

Spär de Postgres Lock Manager op. Bruce Momjian

A wann dëst Iech net komplizéiert genuch ausgesinn huet, da schwätze mir elo mat Iech iwwer Deadlocks. Ech weess net ween vun iech se begéint huet. Dëst ass e zimlech allgemenge Problem an Datebanksystemer. Awer Deadlocks sinn wann eng Sessioun op eng aner Sessioun waart fir eppes ze maachen. An dee Moment waart nach eng Sessioun op déi éischt Sessioun fir eppes ze maachen.

An, zum Beispill, wann den Ivan seet: "Gëff mir eppes", an ech soen: "Nee, ech ginn Iech et nëmmen wann Dir mir eppes anescht gitt." An hie seet: "Nee, ech ginn Iech et net wann Dir et mir net gitt." A mir kommen an enger Defaite Situatioun. Ech si sécher, datt den Ivan dat net wäert maachen, awer Dir verstitt d'Bedeitung datt mir zwee Leit hunn, déi eppes wëllen kréien a si sinn net prett et ze ginn, bis déi aner Persoun hinnen gëtt wat se wëllen. An et gëtt keng Léisung.

A wesentlech muss Är Datebank dëst z'entdecken. An da musst Dir eng vun de Sessiounen läschen oder zoumaachen, well soss bleiwen se fir ëmmer do. A mir gesinn et an Datenbanken, mir gesinn et an Betribssystemer. An op alle Plazen, wou mer parallel Prozesser hunn, kann dat geschéien.

Spär de Postgres Lock Manager op. Bruce Momjian

An elo wäerte mir zwee Deadlocks installéieren. Mir setzen 50 an 80. An der éischter Zeil update ech vun 50 op 50. Ech kréien Transaktiounsnummer 710.

Spär de Postgres Lock Manager op. Bruce Momjian

An dann änneren ech 80 op 81, an 50 op 51.

Spär de Postgres Lock Manager op. Bruce Momjian

An esou wäert et ausgesinn. An dofir huet 710 eng Rei gespaart, an 711 waart op d'Bestätegung. Mir hunn dëst gesinn wéi mir aktualiséiert hunn. 710 ass de Besëtzer vun eiser Serie. A 711 waart op 710 fir d'Transaktioun ofzeschléissen.

Spär de Postgres Lock Manager op. Bruce Momjian

An et seet souguer, op wéi enger Rei d'Stierwen optrieden. An hei fänkt et komesch ze ginn.

Spär de Postgres Lock Manager op. Bruce Momjian

Elo aktualiséieren mir 80 op 80.

Spär de Postgres Lock Manager op. Bruce Momjian

An dat ass wou d'Deadlocks ufänken. 710 waart op eng Äntwert vum 711, an 711 waart op 710. An dat wäert net gutt ophalen. An et gëtt kee Wee aus dësem. A si wäerten eng Äntwert vuneneen erwaarden.

Spär de Postgres Lock Manager op. Bruce Momjian

An et fänkt just un alles ze verzögeren. A mir wëllen dat net.

Spär de Postgres Lock Manager op. Bruce Momjian

A Postgres huet Weeër fir ze bemierken wann dëst geschitt. A wann dat geschitt, kritt Dir dëse Feeler. An aus dësem ass et kloer datt esou an esou e Prozess op e SHARE LOCK vun engem anere Prozess waart, dh deen duerch 711 Prozess blockéiert ass. An dee Prozess waart op e SHARE LOCK fir op esou an esou enger Transaktiouns-ID ze ginn a gouf duerch esou an esou e Prozess blockéiert. Dofir gëtt et hei eng Defaite Situatioun.

Spär de Postgres Lock Manager op. Bruce Momjian

Ginn et dräi-Manéier Deadlocks? Ass et méiglech? Jo.

Spär de Postgres Lock Manager op. Bruce Momjian

Mir gitt dës Zuelen an eng Tabell. Mir änneren 40 op 40, mir blockéieren.

Spär de Postgres Lock Manager op. Bruce Momjian

Mir änneren 60 op 61, 80 op 81.

Spär de Postgres Lock Manager op. Bruce Momjian

An dann änneren mir 80 an dann Boom!

Spär de Postgres Lock Manager op. Bruce Momjian

An de 714 waart elo op de 715. De 716. op de 715. An näischt kann doriwwer gemaach ginn.

Spär de Postgres Lock Manager op. Bruce Momjian

Et sinn net méi zwee Leit hei, et si schonn dräi Leit hei. Ech wëll eppes vun Iech, dee wëll eppes vun enger drëtter Persoun, an déi drëtt Persoun wëll eppes vu mir. A mir schléissen an engem Dräi-Wee Waarden, well mir all waarden op déi aner Persoun fir fäerdeg ze maachen wat se maache mussen.

Spär de Postgres Lock Manager op. Bruce Momjian

A Postgres weess op wéi enger Rei dat geschitt. An dofir wäert et Iech de folgende Message ginn, wat weist datt Dir e Problem hutt wou dräi Input géigesäiteg blockéieren. An et gi keng Restriktiounen hei. Dëst kann de Fall sinn, wou 20 Entréen géigesäiteg blockéieren.

Spär de Postgres Lock Manager op. Bruce Momjian

Den nächste Problem ass serialiséierbar.

Spär de Postgres Lock Manager op. Bruce Momjian

Wann speziell serializable Spär.

Spär de Postgres Lock Manager op. Bruce Momjian

A mir ginn zréck op 719. Seng Ausgang ass ganz normal.

Spär de Postgres Lock Manager op. Bruce Momjian

An Dir kënnt klickt fir d'Transaktioun vu serialiséierbar ze maachen.

Spär de Postgres Lock Manager op. Bruce Momjian

An Dir mierken, datt Dir elo eng aner Zort SA Spär hunn - et heescht serializable.

Spär de Postgres Lock Manager op. Bruce Momjian

Spär de Postgres Lock Manager op. Bruce Momjian

An dofir hu mir eng nei Zort Spär mam Numm SARieadLock, wat e Serienschloss ass an Iech erlaabt Serien anzeginn.

Spär de Postgres Lock Manager op. Bruce Momjian

An och Dir kënnt eenzegaarteg Indexen aginn.

Spär de Postgres Lock Manager op. Bruce Momjian

An dëser Tabell hu mir eenzegaarteg Indizes.

Spär de Postgres Lock Manager op. Bruce Momjian

Also wann ech hei d'Nummer 2 setzen, also hunn ech eng 2. Mee ganz uewen setzen ech nach eng 2. An Dir kënnt gesinn datt 721 en exklusive Spär huet. Awer elo waart den 722 op 721 fir seng Operatioun ofzeschléissen, well en 2 net ka setzen bis e weess wat mam 721 geschéie wäert.

Spär de Postgres Lock Manager op. Bruce Momjian

A wa mir subtransaction maachen.

Spär de Postgres Lock Manager op. Bruce Momjian

Hei hu mir 723.

Spär de Postgres Lock Manager op. Bruce Momjian

A wa mir de Punkt späicheren an dann aktualiséieren, da kréie mir eng nei Transaktiouns-ID. Dëst ass en anert Verhalensmuster Dir musst bewosst sinn. Wa mir dëst zréckginn, da geet d'Transaktiouns-ID fort. 724 geet fort. Awer elo hu mir 725.

Also wat probéieren ech hei ze maachen? Ech probéieren Iech Beispiller vun ongewéinlech Spären ze weisen, datt Dir fannt: ob et serialisable Spären oder SAVEPOINT, dës sinn verschidden Zorte vu Spären, datt am Spär Dësch schéngen wäert.

Spär de Postgres Lock Manager op. Bruce Momjian

Dëst ass d'Schafung vun explizit (explizit) Spären, déi pg_advisory_lock hunn.

Spär de Postgres Lock Manager op. Bruce Momjian

An Dir gesitt datt d'Blockéierungstyp als berodend opgelëscht ass. An hei steet "beroder" rout. An Dir kënnt gläichzäiteg esou mat pg_advisory_unlock blockéieren.

Spär de Postgres Lock Manager op. Bruce Momjian

An zu Conclusioun, Ech géif gären Iech nach eng méi mind-blowing Saach ze weisen. Ech schafen eng aner Vue. Mee ech wäert der pg_locks Dësch mat der pg_stat_activity Dësch bäitrieden. A firwat wëll ech dat maachen? Well dëst erlaabt mir all déi aktuell Sessiounen ze kucken an ze gesinn a genau ze kucken op wéi eng Schlässer se waarden. An dëst ass ganz interessant wa mir de Sperrtabel an d'Ufro-Tabel zesummesetzen.

Spär de Postgres Lock Manager op. Bruce Momjian

An hei kreéiere mir pg_stat_view.

Spär de Postgres Lock Manager op. Bruce Momjian

A mir update der Rei vun eent. An hei gesi mer 724. An dann aktualiséieren mir eis Rei op dräi. A wat gesitt Dir elo hei? Dëst sinn Ufroen, dh Dir gesitt déi ganz Lëscht vun Ufroen, déi an der lénkser Kolonn opgezielt sinn. An dann op der rietser Säit kënnt Dir d'Blockéierungen gesinn a wat se kreéieren. An et ka méi kloer fir Iech sinn, fir datt Dir net all Kéier op all Sessioun zréck musst goen a kucken ob Dir musst matmaachen oder net. Si maachen et fir eis.

Eng aner Feature déi ganz nëtzlech ass ass pg_blocking_pids. Dir hutt wahrscheinlech ni vun hatt héieren. Wat mécht hatt? Et erlaabt eis ze soen, datt fir dës Sessioun 11740 wat spezifesch Prozess IDen et gewaart. An Dir gesitt, datt 11740 op 724 waarden. An 724 ass ganz uewen. An 11306 ass Är Prozess ID. Weesentlechen geet dës Funktioun duerch Är Spär Dësch. An ech weess, datt et e bësse komplizéiert ass, mä Dir verwalt et ze verstoen. Wesentlech geet dës Funktioun duerch dës Sperrtabell a probéiert ze fannen wou dës Prozess-ID d'Schlässer kritt op déi se waart. An et probéiert och erauszefannen wéi eng Prozess-ID de Prozess deen op d'Spär gewaart huet. Also kënnt Dir dës Funktioun lafen pg_blocking_pids.

An dëst kann ganz nëtzlech sinn. Mir hunn dëst nëmmen an der Versioun 9.6 bäigefüügt, sou datt dës Feature nëmme 5 Joer al ass, awer et ass ganz, ganz nëtzlech. An dat selwecht gëllt fir déi zweet Demande. Et weist genee wat mir musse gesinn.

Spär de Postgres Lock Manager op. Bruce Momjian

Dëst ass wat ech mat Iech wollt schwätzen. A wéi ech erwaart hunn, hu mir all eis Zäit benotzt well et sou vill Rutschen waren. An d'Rutschen sinn verfügbar fir erofzelueden. Ech soen Iech Merci datt Dir hei sidd. Ech sécher Dir wäert de Rescht vun der Konferenz genéissen, villmools Merci!

Froen:

Zum Beispill, wann ech probéieren Zeile ze aktualiséieren, an déi zweet Sessioun probéiert de ganzen Dësch ze läschen. Souwäit ech verstinn, et soll eppes wéi eng Absicht Spär ginn. Gëtt et esou eppes am Postgres?

Spär de Postgres Lock Manager op. Bruce Momjian

Komme mer zréck op den Ufank. Dir kënnt Iech drun erënneren datt wann Dir eppes maacht, zum Beispill wann Dir e SELECT maacht, mir en AccessShareLock ausginn. An dat verhënnert datt den Dësch erofgeet. Also wann Dir, zum Beispill, eng Zeil an enger Tabelle wëllt aktualiséieren oder eng Zeil läschen, da kann iergendeen net déi ganz Tabell zur selwechter Zäit läschen well Dir dësen AccessShareLock iwwer de ganzen Dësch an iwwer d'Zeil hält. A wann Dir fäerdeg sidd, kënne se et läschen. Awer wann Dir direkt eppes do ännert, kënnen se et net maachen.

Loosst eis et nach eng Kéier maachen. Loosst eis op d'Läsche Beispill goen. An Dir gesitt wéi et eng exklusiv Spär op der Rei iwwer de ganzen Dësch ass.

Dëst wäert kucken wéi Spär exklusiv, riets?

Jo, et gesäit aus. Ech verstinn wat Dir schwätzt. Dir sot datt wann ech e SELECT maachen, dann hunn ech e ShareExclusive an dann maachen ech et Row Exclusive, gëtt dat e Problem? Awer iwwerraschend stellt dëst kee Problem. Dëst gesäit aus wéi d'Erhéijung vum Sperrgrad, awer am Wesentlechen hunn ech e Spär deen d'Läschung verhënnert. An elo, wann ech dës Spär méi mächteg maachen, verhënnert et ëmmer nach d'Läschung. Also et ass net wéi wann ech eropgoen. Dat ass, et huet verhënnert datt et geschitt wann et och op engem nidderegen Niveau war, also wann ech säin Niveau erhéijen, verhënnert et ëmmer datt den Dësch geläscht gëtt.

Ech verstinn wat Dir schwätzt. Et gëtt keng Spär Eskalatioun Fall hei, wou Dir probéiert e Spär opzeginn fir eng méi staark aféieren. Hei erhéicht et just dës Präventioun iwwerall, sou datt et kee Konflikt verursaacht. Awer et ass eng gutt Fro. Villmols Merci fir dëst ze froen!

Wat musse mir maachen fir eng Deadlock Situatioun ze vermeiden wa mir vill Sessiounen hunn, eng grouss Zuel vu Benotzer?

Postgres bemierkt automatesch Deadlock Situatiounen. An et wäert automatesch eng vun de Sessiounen läschen. Deen eenzege Wee fir dout Blockéierung ze vermeiden ass d'Leit an der selwechter Uerdnung ze blockéieren. Also wann Dir Är Demande kuckt, dacks de Grond fir Deadlocks ... Loosst eis virstellen datt ech zwou verschidde Saachen blockéiere wëll. Eng Applikatioun sperrt den Dësch 1, an eng aner Applikatioun sperrt 2, an dann den Dësch 1. An deen einfachste Wee fir Deadlocks ze vermeiden ass Är Applikatioun ze kucken a probéiert sécher ze stellen datt d'Sperrung an der selwechter Uerdnung iwwer all Applikatiounen geschitt. An dëst eliminéiert normalerweis 80% vun de Probleemer, well all Zorte vu Leit dës Uwendungen schreiwen. A wann Dir se an der selwechter Uerdnung blockéiert, da stitt Dir net op eng Deadlock Situatioun.

Villmools Merci fir Är Leeschtung! Dir hutt iwwer Vakuum voll geschwat an, wann ech richteg verstinn, Vakuum voll verzerrt d'Uerdnung vun den Opzeechnungen an enger getrennter Lagerung, sou datt se déi aktuell records onverännert halen. Firwat hëlt Vakuum voll exklusiv Spär Zougang a firwat et Konflikt mat Schreiwen Operatiounen?

Dat ass eng gutt Fro. De Grond ass datt Vakuum voll den Dësch hëlt. A mir kreéieren am Fong eng nei Versioun vum Dësch. An den Dësch wäert nei sinn. Et stellt sech eraus datt dëst eng komplett nei Versioun vum Dësch wäert sinn. An de Problem ass datt wa mir dat maachen, mir wëllen net datt d'Leit et liesen well mir se brauchen fir den neien Dësch ze gesinn. An esou verbënnt dat mat der viregter Fro. Wa mir gläichzäiteg liese kéinten, kënne mir et net réckelen an d'Leit op en neien Dësch leien. Mir mussen op jidderee waarden fir dësen Dësch fäerdeg ze liesen, an dofir ass et am Wesentlechen eng exklusiv Situatioun.
Mir soen just, mir spären vun Ufank un, well mir wëssen, datt mir um Enn en exklusive Spär brauchen fir jiddereen op déi nei Kopie ze plënneren. Also kënne mir dëst potenziell léisen. A mir maachen et esou mat enger simultaner Indexéierung. Awer dëst ass vill méi schwéier ze maachen. An dëst bezitt sech ganz op Är fréier Fro iwwer Spär exklusiv.

Ass et méiglech Sperr-Timeout op Postgres ze addéieren? Am Oracle kann ech zum Beispill "Auswielen fir ze aktualiséieren" schreiwen an 50 Sekonnen ze waarden ier ech aktualiséieren. Et war gutt fir d'Applikatioun. Mee am Postgres muss ech entweder direkt maachen a guer net waarden, oder bis eng Zäit waarden.

Jo, Dir kënnt e Timeout op Äre Schleisen wielen, op Är Schlässer. Dir kënnt och e No-Way Kommando ausginn, wat ... wann Dir net direkt d'Schloss kritt. Dofir, entweder e Spär-Timeout oder soss eppes wat Iech erlaabt dëst ze maachen. Dëst gëtt net um syntakteschem Niveau gemaach. Dëst gëtt als Variabel um Server gemaach. Heiansdo kann dëst net benotzt ginn.

Kënnt Dir Rutsch 75 opmaachen?

Jo.

Spär de Postgres Lock Manager op. Bruce Momjian

A meng Fro ass déi folgend. Firwat erwaarden béid Updateprozesser 703?

An dëst ass eng grouss Fro. Ech verstinn iwwregens net firwat Postgres dat mécht. Awer wéi 703 erstallt gouf, huet et 702 erwaart. A wann 704 an 705 opdauchen, schéngt et wéi wann se net wësse wat se erwaarden, well et gëtt nach näischt do. A Postgres mécht et esou: wann Dir kee Spär kritt, schreift et "Wat ass de Punkt fir Iech ze veraarbecht?", well Dir waart schonn op een. Also mir loossen et einfach an der Loft hänken, et wäert et guer net aktualiséieren. Mee wat ass hei geschitt? Soubal 702 de Prozess ofgeschloss huet an 703 seng Spär krut, ass de System zréck. A si sot, datt mir elo zwee Leit hunn, déi waarden. A loosst eis se zesummen aktualiséieren. A loosst eis uginn datt béid erwaarden.

Ech weess net firwat Postgres dat mécht. Awer et gëtt e Problem genannt f .... Et schéngt mir, datt dëst net e Begrëff op Russesch ass. Dat ass wann jiddereen op eng Buerg waart, och wann et 20 Autoritéiten sinn, déi op d'Schlass waarden. An op eemol sinn se all gläichzäiteg erwächen. A jidderee fänkt un ze probéieren ze reagéieren. Mee de System mécht et esou, datt jiddereen op 703. Well se all waarden, a mir wäerten se direkt all Formatioun. A wann all aner nei Ufro schéngt, datt no dëser generéiert gouf, zum Beispill, 707, da gëtt et nees eidel.

An et schéngt mir, datt dat gemaach gëtt, fir datt mir kënne soen, datt an dësem Stadium de 702 op 703 waart, an all déi, déi duerno kommen, wäerten an dësem Beräich keen Entrée kréien. Awer soubal den éischte Kellner fortgeet, kréien all déi, déi dee Moment virum Update gewaart hunn, deeselwechten Token. An dofir mengen ech, datt dat gemaach gëtt, fir datt mir kënnen an Uerdnung veraarbecht ginn, fir datt se richteg bestallt ginn.

Ech hunn dat ëmmer als en zimlech komesche Phänomen ugesinn. Well hei, zum Beispill, lëschte mir se guer net. Mä et schéngt fir mech, datt all Kéier mir eng nei Spär ginn, mir kucken op all déi, déi am Prozess vun waarden. Da setzen mir se all op. An da kënnt all Neien, deen erakënnt, eréischt an d'Schlaang, wann déi nächst Persoun fäerdeg ass ze veraarbecht. Ganz gutt Fro. Villmols Merci fir Är Fro!

Et schéngt mir datt et vill méi logesch ass wann 705 704 erwaart.

Awer de Problem hei ass déi folgend. Technesch kënnt Dir deen een oder deen aneren erwächen. An esou wäerte mir déi eng oder déi aner erwächen. Awer wat geschitt am System? Dir kënnt gesinn wéi 703 ganz uewen seng eegen Transaktiouns-ID blockéiert huet. Dëst ass wéi Postgres funktionnéiert. A 703 gëtt duerch seng eegen Transaktiouns-ID blockéiert, also wann iergendeen wëll waarden, da wäerte se op 703 waarden. An am Wesentlechen ass 703 fäerdeg. An eréischt no senger Fäerdegstellung erwächt ee vun de Prozesser. A mir wëssen net wat genau dëse Prozess wäert sinn. Da veraarbecht mir alles lues a lues. Awer et ass net kloer wéi ee Prozess als éischt erwächt gëtt, well et kéint ee vun dëse Prozesser sinn. Wesentlech hate mir e Scheduler dee gesot huet, mir kënnen elo ee vun dëse Prozesser erwächen. Mir wielen just een zoufälleg. Also déi zwee musse bemierkt ginn well mir entweder vun hinnen kënnen erwächen.

An de Problem ass datt mir CP-Infinity hunn. An dofir ass et ganz wahrscheinlech datt mir de spéider erwächen kënnen. A wa mir zum Beispill dee spéider erwächen, waarden mir op deen, dee just de Block kritt huet, sou datt mir net bestëmmen, wien genee fir d'éischt erwächt gëtt. Mir kreéieren einfach esou eng Situatioun, an de System wäert se an enger zoufälleger Uerdnung erwächen.

et ginn Artikelen iwwer Schleisen vum Egor Rogov. Kuckt, si sinn och interessant an nëtzlech. D'Thema ass natierlech schrecklech komplex. Villmols Merci, Bruce!

Source: will.com

Setzt e Commentaire