{"id":87954,"date":"2020-07-12T01:42:48","date_gmt":"2020-07-11T23:42:48","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/unlocking-the-postgres-lock-manager-bryus-momzhian"},"modified":"2020-07-12T01:42:48","modified_gmt":"2020-07-11T23:42:48","slug":"unlocking-the-postgres-lock-manager-bryus-momzhian","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unlocking-the-postgres-lock-manager-bryus-momzhian","title":{"rendered":"Sbloccare il Postgres Lock Manager. Bruce Momjian","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2020 \u0433\u043e\u0434\u0430 \u0411\u0440\u044e\u0441\u0430 \u041c\u043e\u043c\u0436\u0438\u0430\u043d\u0430 &quot;Unlocking the Postgres Lock Manager&quot;.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/1f75fbb0cb41c306c33c823ef55f7238.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>(Nota: tutte le query SQL delle diapositive possono essere ottenute a questo link: <noindex><a rel=\"nofollow\" href=\"http:\/\/momjian.us\/main\/writings\/pgsql\/locking.sql\">http:\/\/momjian.us\/main\/writings\/pgsql\/locking.sql<\/a><\/noindex>)<\/p>\n<p><\/p>\n<p>Ciao! \u00c8 fantastico essere di nuovo qui in Russia. Mi scuso per non essere potuto venire l'anno scorso, ma quest'anno Ivan ed io abbiamo grandi progetti. Spero di essere qui molto pi\u00f9 spesso. Adoro venire in Russia. Visiter\u00f2 Tyumen e Tver. Sono molto felice di avere l'opportunit\u00e0 di visitare queste citt\u00e0. <\/p>\n<p><\/p>\n<p>Mi chiamo Bruce Momjian. Lavoro in EnterpriseDB e utilizzo Postgres da oltre 23 anni. Vivo a Filadelfia, negli Stati Uniti. Viaggio circa 90 giorni all'anno e partecipo a circa 40 conferenze. Il mio <noindex><a rel=\"nofollow\" href=\"https:\/\/momjian.us\/\">sito web<\/a><\/noindex>, che contiene le diapositive che vi mostrer\u00f2 ora. Quindi, dopo la conferenza, potete scaricarle dal mio sito personale. Ci sono anche circa 30 presentazioni disponibili. Inoltre, ci sono video e un gran numero di post sul blog, oltre 500. \u00c8 una risorsa piuttosto sostanziosa. E se vi interessa questo materiale, vi invito a utilizzarlo. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>In passato ero professore, prima di iniziare a lavorare con Postgres. Sono molto felice di potervi raccontare ci\u00f2 che ho in programma di condividere. \u00c8 una delle mie presentazioni pi\u00f9 interessanti. Questa presentazione contiene 110 diapositive. Inizieremo parlando di concetti semplici, ma man mano che andremo avanti, il discorso diventer\u00e0 sempre pi\u00f9 complesso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/9c2e95851f3d8dc92d2ca40b5f29cd52.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c8 una conversazione piuttosto sgradevole. Il locking non \u00e8 un argomento molto popolare. Vorremmo che sparisse. \u00c8 come andare dal dentista. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/bbb2bf8495d458c5bc4a162880a807bb.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ol>\n<li>Il locking \u00e8 un problema per molte persone che lavorano con i database e che hanno pi\u00f9 processi in esecuzione contemporaneamente. Hanno bisogno del locking. Quindi oggi vi fornir\u00f2 le basi su questo argomento. <\/li>\n<li>Identificatori delle transazioni. Questa \u00e8 una parte piuttosto noiosa della presentazione, ma \u00e8 fondamentale comprenderla.<\/li>\n<li>Passiamo ora ai tipi di locking. Questa \u00e8 una parte abbastanza meccanica. <\/li>\n<li>Successivamente, presenteremo alcuni esempi di locking. E sar\u00e0 piuttosto complesso da comprendere. <\/li>\n<\/ol>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/7261d9ed162b7f582ec91d6aa98fac01.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Parliamo di locking.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/13664632ed5ce42ea3ae20830117931e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La nostra terminologia \u00e8 piuttosto complessa. Quanti di voi sanno da dove viene questo estratto? Due persone. Proviene da un gioco chiamato \"Colossal Cave Adventure\". Era un videogioco testuale degli anni '80, se non sbaglio. Bisognava entrare in una caverna, in un labirinto, e il testo cambiava, ma il contenuto era pi\u00f9 o meno lo stesso ogni volta. Cos\u00ec ricordo questo gioco. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/8e8b88cb4d3fabc9d60bacb771a6ea38.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui vediamo i nomi dei blocchi che ci sono stati forniti da Oracle. Li utilizziamo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/37941629c5bde0c387fcd34565e99a9e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui ci sono termini che mi confondono. Ad esempio, SHARE UPDATE EXCLUSIVE. Poi SHARE RAW EXCLUSIVE. Onestamente, questi nomi non sono molto chiari. Cercheremo di esaminarli in dettaglio. Alcuni contengono la parola \"share\", che significa \u2013 separarsi. Alcuni contengono la parola \"exclusive\" \u2014 esclusivo. Alcuni contengono entrambe queste parole. Vorrei cominciare con il modo in cui funzionano questi blocchi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/dffa5b94dc39bd00b5abc1ef1db9c334.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c8 anche molto importante la parola \"access\" \u2014 accesso. E la parola \"row\" \u2014 riga. Cio\u00e8, distribuzione dell'accesso, distribuzione delle righe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/1caf91a69510d21c74700bfdcf6f7f46.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un'altra questione da comprendere in Postgres, e purtroppo non potr\u00f2 parlarne nella mia presentazione, \u00e8 il MVCC. Ho una presentazione separata su questo argomento sul mio sito web. E se pensate che questa presentazione sia complessa, il MVCC \u00e8 probabilmente la mia pi\u00f9 complessa. Se vi interessa, potete vederla sul sito. Potete guardare il video. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/cbaecfa1a74340ad497b080dfc577eb2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un altro aspetto che dobbiamo capire sono gli identificatori delle transazioni. Molte transazioni non possono funzionare senza identificatori unici. Qui \u00e8 fornita una spiegazione su cosa sia una transazione. In Postgres ci sono due sistemi di numerazione delle transazioni. Lo so, non \u00e8 una soluzione molto elegante. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/52d603a076ce0e74f39c00bdf6b06ef5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tenete presente che le diapositive saranno piuttosto complesse da comprendere, quindi \u00e8 importante prestare attenzione a ci\u00f2 che \u00e8 evidenziato in rosso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/df937b924ec12772447269e01cdf7cf9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/momjian.us\/main\/writings\/pgsql\/locking.sql\">http:\/\/momjian.us\/main\/writings\/pgsql\/locking.sql<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Vediamo. Il numero della transazione \u00e8 evidenziato in rosso. Qui \u00e8 mostrata la funzione SELECT pg_back. Essa restituisce la mia transazione e l'ID di questa transazione. <\/p>\n<p><\/p>\n<p>Un altro aspetto: se ti piace questa presentazione e desideri avviarla nel tuo database, puoi seguire questo link evidenziato in rosa e scaricare il SQL per questa presentazione. Puoi semplicemente eseguirlo nel tuo PSQL e l'intera presentazione apparir\u00e0 sul tuo schermo immediatamente. Non conterr\u00e0 colori, ma almeno potremo vederla.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/aeaeecc16029e5fa54583223069578d1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In questo caso vediamo l'ID della transazione. \u00c8 il numero che le abbiamo assegnato. E c'\u00e8 anche un altro tipo di ID della transazione in Postgres, chiamato ID virtuale della transazione.<\/p>\n<p><\/p>\n<p>Dobbiamo comprenderlo. \u00c8 molto importante, altrimenti non saremo in grado di capire il blocco in Postgres.<\/p>\n<p><\/p>\n<p>L'ID virtuale della transazione \u00e8 un ID della transazione che non contiene valori fissi. Ad esempio, se eseguo un comando SELECT, probabilmente non cambier\u00f2 il database e non bloccher\u00f2 nulla. Pertanto, quando eseguiamo un semplice SELECT, non diamo a questa transazione un ID fisso. Le diamo solo un ID virtuale.<\/p>\n<p><\/p>\n<p>E questo migliora le prestazioni di Postgres, ottimizzando le capacit\u00e0 di pulizia, quindi l'ID virtuale della transazione \u00e8 composto da due numeri. Il primo numero prima della barra \u00e8 l'ID del backend. A destra vediamo semplicemente un contatore.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/8813ab1f15f71ce4fbb5448bde2cfba6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, se eseguo una richiesta, dice che l'ID del backend \u00e8 2. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/b6f4e3a2ad8d6801af2716b0bd3bf75a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se eseguo una serie di tali transazioni, vediamo che il contatore aumenta ogni volta che eseguo una richiesta. Ad esempio, quando eseguo la richiesta 2\/10, 2\/11, 2\/12 e cos\u00ec via. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/0b5fbb897233ff3dd07b807af4d4e0d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tenete presente che ci sono due colonne. A sinistra vediamo l'ID virtuale della transazione \u2013 2\/12. A destra abbiamo l'ID permanente della transazione. E questo campo \u00e8 vuoto. E questa transazione non modifica il database. Pertanto, non le assegno un ID permanente della transazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/e8ab3dc34ce6036eedfb87e56f41d01a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Non appena eseguo il comando di analisi (ANALYZE), la stessa richiesta mi fornisce un ID permanente della transazione. Vedete come \u00e8 cambiato. Prima non avevo questo ID, ora \u00e8 apparso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/ca546a3006bfc0881ef1c7e7fe878c7a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, qui c'\u00e8 un'altra richiesta, un'altra transazione. Il numero virtuale della transazione \u00e8 2\/13. E se chiedo l'ID permanente della transazione, quando eseguo la richiesta, lo ottengo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/69bf4082be1832504a823f6420d62609.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, per chiarire. Abbiamo un ID virtuale della transazione e un ID permanente della transazione. \u00c8 importante comprendere questo concetto per capire il comportamento di Postgres.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/ecc70c44ceee36dab9c98bcfcebf4c8f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Passiamo alla terza sezione. Qui esamineremo i diversi tipi di blocchi in Postgres. Non \u00e8 molto interessante. L'ultima sezione sar\u00e0 sicuramente pi\u00f9 coinvolgente. Ma dobbiamo trattare le basi, altrimenti non comprenderemo ci\u00f2 che verr\u00e0 dopo. <\/p>\n<p><\/p>\n<p>Affronteremo questa sezione, guarderemo ogni tipo di blocco. Vi mostrer\u00f2 esempi di come vengono impostati, come funzionano, e vi presenter\u00f2 alcune query che potete usare per osservare come funziona il blocco in Postgres.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/2074b6c82ff77525090c868d0c9f09f5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per creare una query e vedere cosa succede in Postgres, dobbiamo eseguire una query nella vista di sistema. In questo caso, evidenziamo in rosso pg_lock. Pg_lock \u00e8 una tabella di sistema che ci indica quali blocchi sono attualmente attivi in Postgres.<\/p>\n<p><\/p>\n<p>Tuttavia, \u00e8 molto difficile per me mostrarti pg_lock da solo, perch\u00e9 \u00e8 piuttosto complesso. Perci\u00f2, ho creato una vista che mostra pg_locks. Inoltre, esegue per me alcune operazioni che mi permettono di capire meglio. Cio\u00e8, esclude i miei blocchi, la mia sessione ecc. \u00c8 semplicemente SQL standard e permette di mostrarti meglio cosa sta succedendo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/8372fff8ded76ace47591850b74db860.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un altro problema \u00e8 che questa vista \u00e8 molto ampia, quindi devo creare una seconda \u2013 lockview2.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/559745d390f99d7d28199be76d3abc18.png\" style=\"display:block;margin: 0 auto;\" \/> E mostra ulteriori colonne dalla tabella. E un'altra, che mi mostra le rimanenti colonne. \u00c8 abbastanza complicato, quindi ho cercato di presentarlo il pi\u00f9 semplicemente possibile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/48d69895241e1f58ac5ef0e385a67644.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, abbiamo creato una tabella chiamata Lockdemo. E abbiamo inserito una riga. Questa \u00e8 la nostra tabella di esempio. Creeremo sezioni per mostrarti semplicemente esempi di blocchi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/2c5a64d5488c1eef7def91a5e0657519.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, una riga, una colonna. Il primo tipo di blocco si chiama ACCESS SHARE. Questo \u00e8 il blocco meno restrittivo. Significa che praticamente non entra in conflitto con gli altri blocchi.<\/p>\n<p><\/p>\n<p>Se vogliamo definire esplicitamente il blocco, eseguiamo il comando \"lock table\". E questo bloccher\u00e0 esplicitamente, cio\u00e8 in modalit\u00e0 ACCESS SHARE, eseguiamo lock table. E se avvio PSQL in background, avvio cos\u00ec una seconda sessione dalla mia prima sessione. Cosa faccio qui? Passo a un'altra sessione e le dico \"mostrami lockview per questa query\". Qui ho AccessShareLock in questa tabella. \u00c8 proprio quello che avevo richiesto. E dice che il blocco \u00e8 stato assegnato. Molto semplice. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/458adfcb7fb0de3f4b23bc703a78534e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inoltre, se guardiamo nella seconda colonna, non c'\u00e8 nulla. Sono vuote. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/f3b848f3c9bfaf1a41273effeb0965e1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se eseguo il comando \"SELECT\", questo \u00e8 un modo implicito (esplicito) per richiedere AccessShareLock. Quindi rilascio la mia tabella e avvio la query, e la query restituisce diverse righe. In una delle righe vediamo AccessShareLock. Cos\u00ec SELECT chiama AccessShareLock nella tabella. E non entra praticamente in conflitto con nulla, perch\u00e9 \u00e8 un blocco di basso livello. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/0d9526dbea91b5e5f4e0e05a20b16d38.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa succede se eseguo SELECT e ho tre tabelle diverse? In precedenza eseguivo solo una tabella, ora ne eseguo tre: pg_class, pg_namespace e pg_attribute.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/415be5bb7cb7cbbe6bbfd0ab1b9b2d3e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ora, mentre guardo la richiesta, vedo 9 AccessShareLocks in tre tabelle. Perch\u00e9? Le tre tabelle sono evidenziate in blu: pg_attribute, pg_class, pg_namespace. Ma puoi anche vedere che tutti gli indici definiti attraverso queste tabelle hanno anch'essi un AccessShareLock.<\/p>\n<p><\/p>\n<p>E questa \u00e8 una lock che praticamente non confligge con altre. E tutto ci\u00f2 che fa \u00e8 semplicemente impedirci di resettare la tabella mentre la stiamo selezionando. Ha senso. Cio\u00e8, se stiamo selezionando una tabella, scompare in quel momento, il che non \u00e8 corretto. <strong>AccessShare \u2013 \u044d\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0438\u0437\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c &quot;\u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0439\u0442\u0435 \u044d\u0442\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043f\u043e\u043a\u0430 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e&quot;<\/strong>. Fondamentalmente, \u00e8 tutto ci\u00f2 che fa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/99c896a5a57f7d64077fad9368f9b41a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ROW SHARE \u00e8 un lock un po' diverso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/bbd833128a83fba3b7271f89e6115425.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Facciamo un esempio. <strong>SELECT ROW SHARE \u00e8 un modo di bloccare ogni singola riga.<\/strong>. Cos\u00ec nessuno pu\u00f2 eliminarle o modificarle mentre le stiamo visualizzando. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/7f7384d5c4c04ffc771192359d785c43.png\" style=\"display:block;margin: 0 auto;\" \/>Quindi, cosa fa SHARE LOCK? Vediamo che l'ID della transazione \u00e8 681 per il SELECT. E questo \u00e8 interessante. Cosa \u00e8 successo qui? Per la prima volta vediamo un numero nel campo 'Lock'. Prendiamo l'ID della transazione, e lui dice che la blocca in modalit\u00e0 esclusiva. Tutto ci\u00f2 che fa \u00e8 indicare che ho una riga che \u00e8 tecnicamente bloccata da qualche parte nella tabella. Ma non dice dove esattamente. Pi\u00f9 avanti lo esamineremo con maggiore dettaglio.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/284a303fd34c167d453facb46e207067.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui diciamo che il blocco \u00e8 utilizzato da noi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/12a2be61a2f406fc125dcab11983e9c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, il blocco esclusivo dice esplicitamente che \u00e8 esclusivo. E se si elimina una riga in questa tabella, proprio questo succeder\u00e0, come puoi vedere. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/23ed127ff4a033a6f51c0b5566fd6a7c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>SHARE EXCLUSIVE \u00e8 un blocco pi\u00f9 lungo.<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/12e6b0217c528ef5034eb328553fefe9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo (ANALYZE) \u00e8 il comando dell'analizzatore che verr\u00e0 utilizzato.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/d11480b90b74c8165a60bd73cf24a683.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>SHARE LOCK \u2013 puoi esplicitamente bloccare in modalit\u00e0 share.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/ee2a5ad8d0da5fb94865abe3cfa70fa7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Puoi anche creare un indice unico. E l\u00ec puoi vedere SHARE LOCK, che fa parte di esso. Blocca la tabella e imposta su di essa il blocco SHARE LOCK.<\/p>\n<p><\/p>\n<p><strong>Per impostazione predefinita, la SHARE LOCK su una tabella significa che altre persone possono leggerla, ma nessuno pu\u00f2 modificarla. E questo \u00e8 esattamente ci\u00f2 che accade quando crei un indice unico.<\/strong><\/p>\n<p><\/p>\n<p>Se creo un indice unico concurrently, avr\u00f2 un altro tipo di blocco, perch\u00e9, come ricordi, l'uso di indici concurrently riduce la necessit\u00e0 di blocchi. E se utilizzo un blocco normale, un indice normale, impedir\u00f2 in questo modo la scrittura nell'indice della tabella durante la sua creazione. Se utilizzo un indice concurrently, dovr\u00f2 usare un altro tipo di blocco. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/5952ba48cda26f907d0d9265a933e880.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>SHARE ROW EXCLUSIVE \u2013 pu\u00f2 essere impostato esplicitamente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/5d780961d3a2e6aa0f82287fb4822782.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oppure possiamo creare una regola, cio\u00e8 prendere un caso specifico in cui sar\u00e0 utilizzata.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/7b0f44c4b44426a8dd7999387b245783.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il blocco EXCLUSIVE significa che nessun altro potr\u00e0 modificare la tabella. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/0b59c38455eb973a10be32c2cae0d2aa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui vediamo vari tipi di blocchi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/5ec2fc9ae765dfa28285b9f025212056.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ACCESS EXCLUSIVE, ad esempio, \u00e8 un comando di blocco. Per esempio, se fai <code>CLUSTER table<\/code>, questo significher\u00e0 che nessuno potr\u00e0 scriverci. E blocca non solo la tabella stessa, ma anche gli indici.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/9290594355c0b8cef5a07be3a94f6c24.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questa \u00e8 la seconda pagina di blocco ACCESS EXCLUSIVE, dove vediamo specificamente cosa sta bloccando nella tabella. Blocca singole righe della tabella, il che \u00e8 piuttosto interessante.<\/p>\n<p><\/p>\n<p>Queste sono tutte le informazioni di base che volevo fornire. Abbiamo parlato di blocchi, degli ID delle transazioni, abbiamo discusso degli ID virtuali delle transazioni e degli ID permanenti delle transazioni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/b9bc44aa88e6760c11a7d0fe247b4b33.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora passeremo attraverso alcuni esempi di blocco. Questa \u00e8 la parte pi\u00f9 interessante. Esamineremo casi molto interessanti. Il mio obiettivo in questa presentazione \u00e8 darvi una migliore comprensione di ci\u00f2 che Postgres fa realmente quando cerca di bloccare determinate cose. Penso che sia molto abile nel bloccare parti specifiche. <\/p>\n<p><\/p>\n<p>Analizziamo alcuni esempi specifici.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/566ecc5ef289e8fdfa5a96bd8b3daa80.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iniziamo con le tabelle e con una riga nella tabella. Quando inserisco qualcosa, mi appare ExclusiveLock, l'ID della transazione e ExclusiveLock sulla tabella. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/840b23a8b942211c93e233006fd3fe4b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se inserisco altre due righe? Ora abbiamo tre righe nella nostra tabella. Ho inserito una riga e ho ottenuto questo in output. E se inserisco altre due righe, cosa c'\u00e8 di strano qui? C'\u00e8 una stranezza, perch\u00e9 ho aggiunto tre righe a questa tabella, ma ho ancora due righe nella tabella di blocco. E questo \u00e8, in sostanza, il comportamento fondamentale di Postgres.<\/p>\n<p><\/p>\n<p>Molti pensano che se nella base di dati bloccate 100 righe, sar\u00e0 necessario creare 100 inserimenti di blocco. Se blocco subito 1.000 righe, mi serviranno 1.000 richieste del genere. E se devo bloccare un milione o un miliardo. Ma se procediamo in questo modo, non funzioner\u00e0 molto bene. Se avessi un sistema che genera inserti di blocco per ciascuna riga, vedresti che \u00e8 complicato. Perch\u00e9 dovresti definire subito una tabella di blocco che pu\u00f2 riempirsi, ma Postgres non funziona in questo modo. <\/p>\n<p><\/p>\n<p>In questo slide \u00e8 molto importante notare che qui viene chiaramente dimostrato che esiste un altro sistema che opera all'interno di MVCC, il quale blocca righe specifiche. Quindi, quando bloccate miliardi di righe, Postgres non genera miliardo di comandi separati per il blocco. Questo ha un impatto molto positivo sulle prestazioni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/09ee01fffbb9bd00c84f2ebce51458cc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E per quanto riguarda l'aggiornamento? Ora sto aggiornando una riga e potete notare che ha eseguito immediatamente due operazioni diverse. Ha bloccato la tabella, ma ha anche bloccato l'indice. E doveva bloccare l'indice perch\u00e9 ci sono restrizioni uniche su questa tabella. Vogliamo assicurarci che nessuno la modifichi, quindi la bloccano.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/3e72d68af2d5ae3cc062b6e8b6da343b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E cosa succede se voglio aggiornare due righe? Vediamo che si comporta allo stesso modo. Eseguiamo il doppio degli aggiornamenti, ma esattamente lo stesso numero di righe bloccate. <\/p>\n<p><\/p>\n<p>Se sei curioso di sapere come fa Postgres, devi ascoltare le mie presentazioni su MVCC per scoprire come Postgres etichetta internamente le righe che modifica. E Postgres ha un modo per farlo, ma non lo fa a livello di blocco delle tabelle, lo fa a un livello pi\u00f9 basso e pi\u00f9 efficiente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/7e119822b0fb7c5aa3c4a463841bc8e1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se voglio eliminare qualcosa? Se elimino, ad esempio, una riga e ho ancora i miei due input per il blocco, anche se volessi eliminarli tutti, essi sono comunque presenti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/c329f9fbc478a25396ea04102715973e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per esempio, se voglio inserire 1.000 righe e poi eliminare o aggiungere altre 1.000 righe, le singole righe che aggiungo o modifico non vengono registrate qui. Vengono registrate a un livello pi\u00f9 basso all'interno della riga stessa. Durante la mia presentazione su MVCC ne ho parlato in dettaglio. Ma \u00e8 molto importante, quando analizzi i blocchi, assicurarti che hai un blocco a livello di tabella e che qui non vedi come viene registrata ogni singola riga. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/5683ca83f5c17da7928fae96c307c2d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E per quanto riguarda il blocco esplicito?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/a1746f121884c898c91e3b5d2ef517b8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se clicco su \u00abaggiorna\u00bb, ho due righe bloccate. E se le seleziono tutte e premo \u00abaggiorna tutto\u00bb, ho comunque due registrazioni di blocco. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/5d5388e5d0aff39042a9cd69edc91eea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Non creiamo registrazioni separate per ogni singola riga. Perch\u00e9 altrimenti le prestazioni calano, ci potrebbero essere troppe. E potremmo trovarci in una situazione scomoda. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/54e88ed51e705701a8b3ddaa4a784d75.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E lo stesso vale se facciamo in modalit\u00e0 condivisa, possiamo farlo per tutte e 30 le volte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/ab9c26e9be090d85b09070ec5ba0d64d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ripristiniamo la nostra tabella, cancelliamo tutto, poi reinseriamo una riga.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/2d0a5b75f5cd08dca97b61bbae6a6cbd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un altro tipo di comportamento che vediamo in Postgres \u00e8 molto noto e desiderato: \u00e8 quello che possiamo effettuare un update o un select. E possiamo farlo simultaneamente. E il select non blocca l'update e viceversa. Diciamo al lettore di non bloccare chi scrive, e chi scrive non blocca il lettore. <\/p>\n<p><\/p>\n<p>Vi mostro un esempio di questo. Ora far\u00f2 una selezione. Poi faremo un INSERT. E poi potrete vedere \u2013 694. Potrete vedere l'ID della transazione che ha eseguito questo inserimento. E cos\u00ec funziona. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/f80f3b68ef43a75a9590ff200741ce83.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se ora guardo il mio ID di backend, \u00e8 diventato \u2013 695. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/65bc487bbfd7b325aa5cffa7373a40a4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E posso vedere che il 695 appare nella mia tabella. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/6ac586641f978615db4d021e85ef702a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se aggiorno qui in questo modo, ottengo un altro caso. In questo caso, 695 \u00e8 un blocco esclusivo, e l'update ha lo stesso comportamento, ma non si creano conflitti tra loro, il che \u00e8 piuttosto insolito. <\/p>\n<p><\/p>\n<p>E puoi notare che in alto c'\u00e8 ShareLock, e in basso c'\u00e8 ExclusiveLock. E entrambe le transazioni sono andate a buon fine.<\/p>\n<p><\/p>\n<p>Dovrei ascoltare la mia presentazione su MVCC per capire come funziona. Ma questa \u00e8 un'illustrazione di ci\u00f2 che puoi fare contemporaneamente, ovvero eseguire SELECT e UPDATE allo stesso tempo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/3bcf43cdb9ee72ea75e17c3bf71f3407.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Facciamo un reset e facciamo un'operazione di nuovo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/fdae265dbebb0fae66e47cd4eb4b1bd6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se provi a eseguire due update contemporaneamente sulla stessa riga, verr\u00e0 bloccata. E ricorda, ho detto che chi legge non blocca chi scrive, ma chi scrive blocca chi legge. Ma un scrittore blocca un altro scrittore. Cio\u00e8, non possiamo fare in modo che due persone aggiornino la stessa riga contemporaneamente. Bisogna aspettare che uno di loro finisca. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/ef9adfe81107468dfea1c5a837b28aaa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E per illustrare questo, dar\u00f2 un'occhiata alla tabella Lockdemo. E guarderemo una riga. Nella transazione 698.<\/p>\n<p><\/p>\n<p>Lo abbiamo aggiornato a 2. 699 \u00e8 il primo aggiornamento. E ha avuto successo oppure \u00e8 in attesa di transazione e aspetta che confermiamo o annulliamo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/9794811cdc204141a74f67ee98fca1f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma guardate un'altra cosa \u2013 2\/51 \u2013 \u00e8 la nostra prima transazione, la nostra prima sessione. 3\/112 \u2013 \u00e8 la seconda richiesta, che \u00e8 apparsa sopra e ha cambiato questo valore in 3. E se notate, l'alto si \u00e8 bloccato da solo, che \u00e8 699. Ma 3\/112 non ha fornito alcun blocco. Nella colonna Lock_mode c'\u00e8 scritto che \u00e8 in attesa. Sta aspettando 699. E se guardate dove si trova 699, \u00e8 sopra. E cosa ha fatto la prima sessione? Ha creato un blocco esclusivo sul proprio ID di transazione. \u00c8 cos\u00ec che Postgres funziona. Blocca il proprio ID di transazione. E se volete aspettare che qualcuno confermi o annulli, dovete aspettare una transazione in attesa. Ecco perch\u00e9 possiamo vedere una riga strana. <\/p>\n<p><\/p>\n<p>Rivediamo un attimo. A sinistra vediamo il nostro ID di elaborazione. Nella seconda colonna troviamo il nostro ID virtuale della transazione, e nella terza vediamo il lock_type. Cosa significa? Fondamentalmente, indica che blocca l'ID della transazione. Ma notate che in tutte le righe in basso c'\u00e8 scritto relation. E quindi avete due tipi di blocco nella tabella. Esiste il blocco relation. E c'\u00e8 anche il blocco transactionid, dove bloccate autonomamente, questo \u00e8 esattamente ci\u00f2 che accade nella prima riga o nella parte inferiore, dove transactionid, dove ci aspettiamo che 699 completi la sua operazione. <\/p>\n<p><\/p>\n<p>Vedo cosa sta accadendo qui. E qui si svolgono due cose contemporaneamente. Stai osservando il blocco per l'ID della transazione nella prima riga, che si blocca da solo. E si blocca da solo per costringere le persone ad aspettare. <\/p>\n<p><\/p>\n<p>Se guardi la sesta riga, troverai la stessa voce della prima. E quindi la transazione 699 \u00e8 bloccata. Anche 700 si blocca da solo. E poi nella riga inferiore vedrete che stiamo aspettando che 699 completi la sua operazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/e712a48cdb9ddc496e4e196eb3bb97c3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E nel lock_type, tuple vedete dei numeri. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/575245898d8455f00583659264b96ce9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Puoi vedere che sono 0\/10. E questo \u00e8 il numero di pagina, e anche l'offset di questa specifica riga. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/7059c7661fc81a7101b2d92d38b6f64c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E vedi che diventa 0\/11 quando aggiorniamo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/4572ef7afc0ba8c8bbf5706ce9415d65.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma in realt\u00e0 \u00e8 0\/10, perch\u00e9 stiamo aspettando che questa operazione si completi. Abbiamo la possibilit\u00e0 di vedere che \u00e8 quella riga che sto aspettando per confermare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/9dc6fb0e3dee8c0b1ccbb724d0bb6c75.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Una volta che l'abbiamo confermata e premuto il commit, e quando l'aggiornamento \u00e8 finito, questo \u00e8 ci\u00f2 che otteniamo di nuovo. La transazione 700 \u00e8 l'unico blocco, non sta aspettando nessun altro perch\u00e9 \u00e8 stata confermata. Sta solo aspettando che la transazione si completi. Una volta che 699 finisce, non stiamo pi\u00f9 aspettando nulla. E ora la transazione 700 dice che va tutto bene, tutte le chiavi necessarie sono disponibili in tutte le tabelle autorizzate. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/42bc10a0c5bbda9bcf3a40f0dd87bc6b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E per complicare ulteriormente le cose, creiamo un'altra vista, che questa volta ci fornir\u00e0 una gerarchia. Non mi aspetto che tu capisca questa query. Ma ci dar\u00e0 una visione pi\u00f9 chiara di ci\u00f2 che sta accadendo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/855f6dd22cba114b051e4eaac106c0ea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questa \u00e8 una vista ricorsiva, che ha anche un'altra sezione. E poi riunisce tutto di nuovo. Utilizziamo questo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/fdb54fae54fb87131c13d67a2f66fae2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se facessimo tre aggiornamenti simultanei e dicessimo che la riga ora \u00e8 pari a tre. E cambiamo 3 in 4. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/f28e0d58e223ef9ccca9ba0acab5b0ce.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ora vediamo 4. E l'ID transazionale \u00e8 702. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/49553b4dc4bb4c07db099fd26a6da22c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poi cambier\u00f2 4 in 5. E 5 in 6, e 6 in 7. E metto in fila una serie di persone che aspettano che questa singola transazione si concluda.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/7f4a4fef1745ad9cdcd602aa0474f6ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E tutto diventa chiaro. Qual \u00e8 la prima fila? \u00c8 702. Questo \u00e8 l'ID transazionale che ha originariamente impostato questo valore. E cosa ho scritto nella colonna Granted? Ho dei segni <code>f<\/code>. Questi sono i miei aggiornamenti (5, 6, 7) che non possono essere approvati, perch\u00e9 stiamo aspettando che l'ID transazionale 702 si concluda. Qui abbiamo un blocco dell'ID transazionale. E quindi ci sono 5 blocchi dell'ID transazionale.<\/p>\n<p><\/p>\n<p>E se guardi 704, 705, l\u00ec non \u00e8 ancora stato scritto nulla, perch\u00e9 non sanno ancora cosa sta accadendo. Scrivono solo che non hanno idea di cosa stia succedendo. E semplicemente andranno a dormire, perch\u00e9 stanno aspettando che qualcuno finisca e li svegli quando ci sar\u00e0 la possibilit\u00e0 di cambiare fila. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/af97313e395a47e43d5ca9e6c78271af.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco come appare. \u00c8 chiaro che stanno tutti aspettando la dodicesima riga. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/611f2d09dfbf78abe6659f794d4ad4f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco cosa abbiamo visto qui. Ecco 0\/12. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/738d1d9b272c6ef2f6e8dffd9cd9c061.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, una volta che la prima transazione \u00e8 approvata, qui puoi vedere come funziona la gerarchia. Ora tutto diventa chiaro. Tutti si liberano. E sono effettivamente ancora in attesa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/7f53df10dd5de8776a07094e68acd195.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco cosa succede. 702 viene committato. Ora 703 acquisisce il blocco della riga, e poi 704 inizia ad aspettare che 703 venga committato. Anche 705 sta aspettando questo. E quando tutto questo si completa, si puliscono da soli. Vorrei far notare che tutti si mettono in fila. \u00c8 molto simile a una situazione di ingorgo, dove tutti aspettano la prima auto. La prima auto si \u00e8 fermata, e tutti si mettono in una lunga fila. Poi si muove, e l'auto successiva pu\u00f2 passare e ricevere il suo blocco, e cos\u00ec via. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/44d6e80e90fbaa3c726bec204ee10f1b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se questo vi \u00e8 sembrato poco complesso, parleremo adesso di deadlock. Non so quanti di voi ci siano gi\u00e0 stati. \u00c8 un problema abbastanza comune nei sistemi di database. Ma i deadlock sono quel caso in cui una sessione attende che un'altra sessione esegua qualcosa. Nel frattempo, l'altra sessione attende che la prima sessione esegua qualcosa. <\/p>\n<p><\/p>\n<p>E, per esempio, se Ivan dice: \u00abDammi qualcosa\u00bb, e io dico: \u00abNo, te lo dar\u00f2 solo se mi dai qualcosa in cambio\u00bb. E lui dice: \u00abNo, non ti dar\u00f2 niente se tu non mi dai qualcosa\u00bb. Ci troviamo quindi in una situazione di stallo. Sono sicuro che Ivan non farebbe una cosa simile, ma capite il senso: due persone vogliono ottenere qualcosa e non sono disposte a cederlo finch\u00e9 l'altra persona non d\u00e0 loro ci\u00f2 che desidera. E qui non c'\u00e8 soluzione. <\/p>\n<p><\/p>\n<p>E, in sostanza, il vostro database deve identificarlo. E poi \u00e8 necessario rimuovere o chiudere una delle sessioni, perch\u00e9 altrimenti rimarranno l\u00ec per sempre. E questo lo vediamo nei database, lo vediamo nei sistemi operativi. E in tutti i luoghi dove abbiamo processi paralleli, pu\u00f2 succedere. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/6acee6bc304593cdd9e411882b5e3406.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ora creeremo due deadlock. Installeremo 50 e 80. Nella prima riga far\u00f2 un aggiornamento da 50 a 50. Otterr\u00f2 il numero di transazione 710. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/28a2a7fb4f91b8f8c6c78affb32d249c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E poi cambier\u00f2 80 in 81 e 50 in 51. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/f6653c36f5a09934035f4838ff0fa380.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco come apparir\u00e0. Pertanto, 710 ha il blocco della riga, mentre 711 attende una conferma. Lo abbiamo visto quando abbiamo effettuato l'aggiornamento. 710 \u00e8 il proprietario della nostra riga. E 711 attende che 710 completi la transazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/99718717ffb2024f4cb92509c2f2b878.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E l\u00ec \u00e8 anche scritto in quale specifica riga si verificano i deadlock. Ed \u00e8 qui che inizia a diventare strano.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/423fc8973c29be1504d5bf8828beaa71.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora stiamo aggiornando 80 su 80. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/3a4b24e58f96205dbdfa8480fac2262a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ed \u00e8 qui che iniziano i deadlock. 710 aspetta una risposta da 711, mentre 711 aspetta 710. E questo non avr\u00e0 una buona conclusione. E non c'\u00e8 via d'uscita. Aspetteranno una risposta l'uno dall'altro. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/19394fa0b4a19991a4a4cc1e181c47e8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E questo inizier\u00e0 a ritardare tutto. E non lo vogliamo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/94c86723b8b42861d682c75f0c54b552.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In Postgres ci sono modi per rilevare quando ci\u00f2 accade. E quando succede, si riceve un errore come questo. E da ci\u00f2 \u00e8 chiaro che un certo processo sta aspettando un SHARE LOCK da un altro processo, cio\u00e8 bloccato dal processo 711. E quel processo stava aspettando che venisse dato un SHARE LOCK su un certo ID di transazione ed \u00e8 stato bloccato da un certo processo. Pertanto, qui c'\u00e8 una situazione di deadlock.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/88a499d8f03be3c9f5bc6c93aa39c9a6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esistono deadlock a tre vie? \u00c8 possibile? S\u00ec. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/20fae4c504b794b678d265a0b1e9e33d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inseriamo questi numeri nella tabella. Cambiamo 40 su 40, creiamo un blocco. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/67b7302545781681b182d4f6ddc93d9f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cambiamo 60 su 61, 80 su 81. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/87aa9680b0160be0d798b2697a0f425d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E poi cambiamo 80, e poi - boom! <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/dc6179e048dfb42e1e11b75f956182c1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E 714 ora aspetta 715. Il 716 attende il 715. E non si pu\u00f2 fare nulla con questo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/e5e190437f420783f4fca26f4f04ecd3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui non ci sono pi\u00f9 due persone, ma gi\u00e0 tre. Voglio qualcosa da te, lui desidera qualcosa dal terzo, e il terzo vuole qualcosa da me. Ci troviamo quindi in un'attesa reciproca, poich\u00e9 tutti aspettiamo che qualcun altro completi ci\u00f2 che deve fare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/fde8e3cb14dc05c520693ca2a99cf5f1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E Postgres sa in quale riga si verifica. Di conseguenza, ti fornir\u00e0 il seguente messaggio che indica che hai un problema in cui tre input si bloccano a vicenda. E non ci sono limiti. Questo pu\u00f2 accadere quando 20 registrazioni si bloccano a vicenda. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/a3dde7b6092b3d2e93c4927b6b42d795.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il problema successivo \u00e8 serializzabile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/9bff965bafaa03a160c0787bfa8606fb.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se c'\u00e8 un blocco serializzabile speciale.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/db310da4461e647ed498e58b1e878fda.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E torniamo a 719. Ha un'uscita del tutto normale. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/e7eca0a2191a62014ad949583a45bf2f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E puoi cliccare per effettuare una transazione in modalit\u00e0 serializzabile.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/4aa78f3e4d07b8ca48d860e8df2dacda.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E capisci che ora hai un altro tipo di blocco SA \u2013 questo significa serializzabile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/f9e79b9b6b1cc581b2178b0285bd3213.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/603dc15cdda0a128c82e87275ca8ba85.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E quindi abbiamo un nuovo tipo di blocco chiamato SARieadLock, che \u00e8 un blocco seriale e consente di inserire numeri di serie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/ce2644b0e8d8b71035044c56a94621f4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E puoi anche inserire indici unici. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/053a37128688fe22040a2c5a3d5ad477.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In questa tabella abbiamo indici unici.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/284e50ea2b0b64a9efda8b9224f466ae.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, se inserisco il numero 2 qui, ho 2. Ma nella parte superiore inserisco un altro 2. E potete vedere che il 721 ha un blocco esclusivo. Ora, per\u00f2, il 722 attende che il 721 completi la sua operazione, perch\u00e9 non pu\u00f2 inserire 2 finch\u00e9 non sa cosa accadr\u00e0 al 721. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/ee01a45e1e16fe0ab10f5d172048f35f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se facciamo una subtransazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/58a67f29a50c5e90d3770492eb7a8fc4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui abbiamo il 723.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/6684b92639d48e62b6abf55bea86a951.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se salviamo il punto e poi lo aggiorniamo, otteniamo un nuovo ID di transazione. Questo \u00e8 un altro comportamento che dovete conoscere. Se lo restituiamo, l'ID di transazione va via. Il 724 va via. Ma ora abbiamo il 725. <\/p>\n<p><\/p>\n<p>E cosa sto cercando di fare qui? Sto cercando di mostrarvi esempi di blocchi insoliti che potete incontrare: che si tratti di blocchi serializzabili o SAVEPOINT - sono diversi tipi di blocchi che appariranno nella tabella dei blocchi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/3e0b5d4b4e84ca18e0e33cb46013cd70.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo \u00e8 il creare blocchi espliciti, che hanno pg_advisory_lock. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/2ce5ecd96cec5bcf0f757eb0093759c3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E vedete che il tipo di blocco \u00e8 elencato qui come advisory. E in rosso c'\u00e8 scritto 'advisory'. E potete bloccare simultaneamente con pg_advisory_unlock.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/5b5ae66d50ce9aaa779bbf47de00b1d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E infine vorrei mostrarvi un'altra cosa sorprendente. Creer\u00f2 un altro tipo. Ma collegher\u00f2 la tabella pg_locks con la tabella pg_stat_activity. E perch\u00e9 voglio farlo? Perch\u00e9 questo mi permetter\u00e0 di vedere tutte le sessioni attuali e quali blocchi stanno aspettando. Ed \u00e8 piuttosto interessante, quando uniamo la tabella dei blocchi con la tabella delle query. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/3949e48d9626a7a030b033dd05e7f042.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E qui creiamo pg_stat_view. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/2b3b7b34bb35f5a67ac5d4ed1328a910.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E aggiorniamo una riga di uno. E qui vediamo 724. Poi aggiorniamo la nostra riga a tre. E cosa vedete qui adesso? Queste sono le query, cio\u00e8 vedete l'intero elenco delle query elencate nella colonna di sinistra. E poi, sul lato destro, potete vedere i blocchi e cosa stanno creando. E questo potrebbe risultarvi pi\u00f9 chiaro, in modo da non dover tornare ogni volta a ogni sessione per vedere se \u00e8 necessario unirsi o meno. Lo fa per noi. <\/p>\n<p><\/p>\n<p>Un'altra funzionalit\u00e0 che \u00e8 molto utile \u00e8 <code>pg_blocking_pids<\/code>. Probabilmente non ne hai mai sentito parlare. Cosa fa? Ci consente di dire quale ID processo 11740 sta aspettando per questa sessione. E puoi vedere che 11740 sta aspettando 724. E 724 \u00e8 in cima. Mentre 11306 \u00e8 il tuo ID processo. Fondamentalmente, questa funzione scorre la tua tabella di blocco. E so che \u00e8 un po' complicato, ma riesci a capirlo. Fondamentalmente, questa funzione percorre questa tabella di blocco e cerca il processo ID, considerando i blocchi che sta aspettando. Prova anche a calcolare quale processo ID ha il processo in attesa di blocco. Quindi puoi eseguire questa funzione. <code>pg_blocking_pids<\/code>.<\/p>\n<p><\/p>\n<p>E questo pu\u00f2 essere davvero utile. L'abbiamo aggiunto solo dalla versione 9.6, quindi questa funzione ha solo 5 anni, ma \u00e8 molto, molto utile. Lo stesso vale per la seconda richiesta. Mostra esattamente ci\u00f2 che abbiamo bisogno di vedere. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/d1975be02ba0cf516ba7bce400228e08.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c8 di questo che volevo parlarvi. E come mi aspettavo, abbiamo utilizzato tutto il nostro tempo, perch\u00e9 c'era un numero cos\u00ec elevato di diapositive. Le diapositive sono disponibili per il download. Vorrei ringraziarvi per essere stati qui. Sono sicuro che vi piacer\u00e0 il resto della conferenza, grazie mille!<\/p>\n<p><\/p>\n<p>Domande:<\/p>\n<p><\/p>\n<p><em>Ad esempio, se sto cercando di aggiornare le righe e la seconda sessione sta cercando di eliminare l'intera tabella. Da quanto ho capito, ci dovrebbe essere qualcosa come un intent lock. Esiste qualcosa di simile in Postgres?<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/ffe86d27f8bc467aeb3884320258d032.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Torniamo all'inizio. Forse ricorderete che quando fate qualsiasi cosa, ad esempio quando eseguite un SELECT, rilasciamo un AccessShareLock. E questo impedisce l'eliminazione della tabella. Quindi, se ad esempio volete aggiornare una riga in una tabella o eliminare una riga, qualcun altro non pu\u00f2 eliminare l'intera tabella contemporaneamente, perch\u00e9 mantenete questo AccessShareLock su tutta la tabella e sulla riga. E una volta che avete finito, possono eliminarla. Ma finch\u00e9 state modificando qualcosa, non possono farlo.<\/p>\n<p><\/p>\n<p>Facciamo un altro esempio. Passiamo a un esempio di eliminazione. E vedete come ci sia un lock esclusivo su tutta la tabella. <\/p>\n<p><\/p>\n<p><em>Sar\u00e0 simile a un lock esclusivo, giusto?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec, sembra cos\u00ec. Capisco cosa intendi. Stai dicendo che, se eseguo un SELECT, avr\u00f2 ShareExclusive, e poi lo trasformo in uno stato Row Exclusive, questo diventa un problema? Ma sorprendentemente non crea problemi. Sembra un aumento del livello di blocco, ma in effetti ho un lock che impedisce la cancellazione. E ora, quando faccio questo lock pi\u00f9 forte, continua a impedire la cancellazione. Quindi non \u00e8 un aumento. Cio\u00e8, impediva gi\u00e0 prima quando era a un livello inferiore, quindi, quando aumento il suo livello, continua a impedire la cancellazione della tabella. <\/p>\n<p><\/p>\n<p>Capisco cosa intendi. Qui non c'\u00e8 un caso di aumento del livello di blocco, dove stai cercando di rinunciare a un lock per introdurne uno pi\u00f9 potente. Qui si tratta semplicemente di un aumento generale di questa prevenzione, quindi non causa alcun conflitto. Ma \u00e8 una bella domanda. Grazie mille per averla posta!<\/p>\n<p><\/p>\n<p><em>Cosa dobbiamo fare per evitare la situazione di deadlock quando abbiamo molte sessioni e un grande numero di utenti?<\/em><\/p>\n<p><\/p>\n<p>Postgres rileva automaticamente situazioni di deadlock e rimuover\u00e0 automaticamente una delle sessioni. L'unico modo per evitare situazioni di deadlock \u00e8 bloccare le entit\u00e0 nello stesso ordine. Pertanto, quando esamini la tua applicazione, spesso la causa dei deadlock \u00e8... Immaginiamo che io voglia bloccare due cose diverse. Un'applicazione blocca la tabella 1, mentre un'altra blocca la tabella 2 e poi la tabella 1. Il modo pi\u00f9 semplice per evitare i deadlock \u00e8 assicurarti che il blocco avvenga sempre nello stesso ordine in tutte le applicazioni. Questo generalmente elimina l'80% dei problemi, poich\u00e9 diversi sviluppatori scrivono queste applicazioni. Se le blocchi nello stesso ordine, non ti troverai ad affrontare situazioni di deadlock.<\/p>\n<p><\/p>\n<p><em>Grazie mille per il tuo intervento! Hai parlato di vacuum full e, se non sbaglio, vacuum full altera l'ordine delle righe in uno storage separato, quindi mantiene le righe esistenti inalterate. Ma perch\u00e9 vacuum full richiede un blocco esclusivo e perch\u00e9 confligge con le operazioni di scrittura?<\/em><\/p>\n<p><\/p>\n<p>\u00c8 una buona domanda. La ragione \u00e8 che vacuum full prende la tabella. E, in sostanza, stiamo creando una nuova versione della tabella. La tabella sar\u00e0 nuova. Risulta che sar\u00e0 una versione completamente nuova della tabella. E il problema \u00e8 che, quando facciamo questo, non vogliamo che le persone la leggano, perch\u00e9 dobbiamo assicurarci che vedano la nuova tabella. E quindi questo si collega alla domanda precedente. Se potessimo leggere contemporaneamente, non saremmo in grado di spostarla e indirizzare le persone alla nuova tabella. Dovremmo attendere che tutti finissero di leggere questa tabella, quindi, in sostanza, si tratta di una situazione di lock esclusivo.<br \/>\nNoi semplicemente affermiamo che blocchiamo fin dall'inizio, perch\u00e9 sappiamo che alla fine avremo bisogno di un blocco esclusivo per spostare tutti su una nuova copia. Quindi, potenzialmente, possiamo risolvere questo. E lo facciamo con un indicizzazione simultanea. Ma \u00e8 molto pi\u00f9 complicato da realizzare. E questo si ricollega molto alla tua domanda precedente sul lock esclusivo.<\/p>\n<p><\/p>\n<p><em>\u00c8 possibile aggiungere un tempo di attesa per il blocco in Postgres? In Oracle posso, ad esempio, scrivere \u201cseleziona per aggiornare\u201d e attendere 50 secondi per l'aggiornamento. Questo andava bene per l'applicazione. Ma in Postgres, o devo farlo subito e non aspettare affatto, oppure attendere fino a un certo tempo.<\/em> <\/p>\n<p><\/p>\n<p>S\u00ec, puoi selezionare un timeout per i tuoi blocchi. Puoi anche emettere il comando no way, che sar\u00e0... se non riesci a ottenere immediatamente il blocco. Quindi, o lock timeout, o qualcos'altro che ti permetter\u00e0 di farlo. Questo non si fa a livello sintattico. Si fa come variabile sul server. A volte non pu\u00f2 essere usato.<\/p>\n<p><\/p>\n<p><em>Puoi aprire 75 slide?<\/em> <\/p>\n<p><\/p>\n<p>S\u00ec.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sbloccare il Postgres Lock Manager. Bruce Momjian\" src=\"\/wp-content\/uploads\/2020\/07\/5f0f3ee9ba29e0c231dd6e0eb66b4f6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>E la mia domanda \u00e8 la seguente. Perch\u00e9 entrambi i processi di aggiornamento aspettano 703?<\/em><\/p>\n<p><\/p>\n<p>E questa \u00e8 una domanda interessante. Non capisco perch\u00e9 Postgres lo faccia. Quando 703 \u00e8 stato creato, si aspettava 702. E quando 704 e 705 appaiono, sembra che non sappiano cosa stanno aspettando, perch\u00e9 non c'\u00e8 ancora nulla. E Postgres agisce in questo modo: quando non riesci a ottenere un blocco, scrive \"Qual \u00e8 il senso di elaborarti?\", perch\u00e9 stai gi\u00e0 aspettando qualcuno. Quindi semplicemente lo lasciamo l\u00ec, non aggiorna affatto. Ma cosa \u00e8 successo qui? Non appena 702 ha completato il processo e 703 ha ottenuto il suo blocco, il sistema \u00e8 tornato indietro. E ha detto che ora abbiamo due persone in attesa. E poi aggiorniamole insieme. E indichiamo che entrambi aspettano. <\/p>\n<p><\/p>\n<p>Non so perch\u00e9 Postgres si comporti in questo modo. Ma c'\u00e8 un problema chiamato f\u2026. Sembra che non sia un termine russo. \u00c8 quando tutti aspettano lo stesso lock, anche se ci sono 20 istanze che aspettano il lock. E all'improvviso si svegliano tutti insieme. E tutti iniziano a cercare di reagire. Ma il sistema fa in modo che tutti aspettino 703. Perch\u00e9 tutti stanno aspettando, e li metteremo immediatamente in coda. E se appare qualsiasi altra nuova richiesta, generata dopo questa, per esempio 707, ci sar\u00e0 di nuovo un vuoto. <\/p>\n<p><\/p>\n<p>E penso che questo venga fatto per poter dire che in questa fase 702 sta aspettando 703, e tutti quelli che arriveranno dopo non avranno nessuna registrazione in questo campo. Ma appena il primo in attesa se ne va, tutti quelli che aspettavano in quel momento prima dell'aggiornamento ricevono lo stesso marker. E quindi, credo sia stato fatto per poter gestire in ordine, in modo che fossero correttamente ordinati. <\/p>\n<p><\/p>\n<p>Ho sempre visto questo come un fenomeno piuttosto strano. Perch\u00e9 qui, ad esempio, non li elenchiamo affatto. Ma credo che ogni volta che diamo un nuovo blocco, guardiamo a tutti coloro che sono in attesa. Allora li mettiamo tutti in coda. E poi, qualsiasi nuovo arrivo viene messo in coda solo quando la persona successiva ha terminato di essere elaborata. Ottima domanda. Grazie mille per la domanda!<\/p>\n<p><\/p>\n<p><em>Mi sembra molto pi\u00f9 logico quando il 705 attende il 704.<\/em> <\/p>\n<p><\/p>\n<p>Ma il problema \u00e8 il seguente. Tecnicamente puoi risvegliare l'uno o l'altro. E quindi risveglieremo quello o l'altro. Ma cosa succede nel funzionamento del sistema? Vedi come 703 in cima ha bloccato il proprio ID di transazione. Questo \u00e8 il modo in cui funziona Postgres. E 703 \u00e8 bloccato dal suo stesso ID di transazione, quindi, se qualcuno vuole aspettare, dovr\u00e0 aspettare 703. E, in sostanza, 703 si completa. Solo dopo il suo completamento, uno dei processi si risveglia. E non sappiamo quale sar\u00e0 esattamente questo processo. Poi elaboriamo gradualmente tutto. Ma non \u00e8 chiaro quale processo si risveglier\u00e0 per primo, perch\u00e9 potrebbe essere uno qualsiasi di questi processi. Fondamentalmente, avevamo uno scheduler che diceva che ora possiamo risvegliare uno qualsiasi di questi processi. Scegliamo semplicemente uno a caso. Pertanto, entrambi devono essere contrassegnati, perch\u00e9 possiamo risvegliare uno qualsiasi di essi. <\/p>\n<p><\/p>\n<p>E il problema \u00e8 che abbiamo la CP-infinito. E quindi \u00e8 molto probabile che possiamo risvegliare quello pi\u00f9 tardi. E se, ad esempio, risvegliamo quello pi\u00f9 tardi, ci aspetteremo colui che ha appena ricevuto un blocco, quindi non definiamo chi sar\u00e0 risvegliato per primo. Creiamo semplicemente una situazione del genere e il sistema li risveglier\u00e0 in ordine casuale. <\/p>\n<p><\/p>\n<p><em>S\u00ec <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/erogov\/posts\/\">articoli sui locks di Egor Rogov<\/a><\/noindex>. Guarda, sono anche interessanti e utili. L'argomento \u00e8, ovviamente, estremamente complesso. Grazie mille, Bruce!<\/em><\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/510322\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2020 \u0433\u043e\u0434\u0430 \u0411\u0440\u044e\u0441\u0430 \u041c\u043e\u043c\u0436\u0438\u0430\u043d\u0430 &quot;Unlocking the Postgres Lock Manager&quot;. (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0412\u0441\u0435 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 \u0441\u043b\u0430\u0439\u0434\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435: http:\/\/momjian.us\/main\/writings\/pgsql\/locking.sql) \u041f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \u0431\u044b\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0432 \u0420\u043e\u0441\u0441\u0438\u0438. \u042f \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u0440\u0438\u0435\u0445\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u0443 \u0418\u0432\u0430\u043d\u0430 \u0438 \u0443 \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043b\u0430\u043d\u044b. \u042f, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":87955,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-87954","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2020 \u0433\u043e\u0434\u0430 \u0411\u0440\u044e\u0441\u0430 \u041c\u043e\u043c\u0436\u0438\u0430\u043d\u0430 &quot;Unlocking the Postgres Lock Manager&quot;. (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0412\u0441\u0435 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 \u0441\u043b\u0430\u0439\u0434\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435: http:\/\/momjian.us\/main\/writings\/pgsql\/locking.sql) \u041f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \u0431\u044b\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0432 \u0420\u043e\u0441\u0441\u0438\u0438. \u042f \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u0440\u0438\u0435\u0445\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u0443 \u0418\u0432\u0430\u043d\u0430 \u0438 \u0443 \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043b\u0430\u043d\u044b. \u042f, \u043d\u0430\u0434\u0435\u044e\u0441\u044c,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unlocking-the-postgres-lock-manager-bryus-momzhian\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Unlocking the Postgres Lock Manager. \u0411\u0440\u044e\u0441 \u041c\u043e\u043c\u0436\u0438\u0430\u043d | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2020 \u0433\u043e\u0434\u0430 \u0411\u0440\u044e\u0441\u0430 \u041c\u043e\u043c\u0436\u0438\u0430\u043d\u0430 &quot;Unlocking the Postgres Lock Manager&quot;. (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0412\u0441\u0435 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 \u0441\u043b\u0430\u0439\u0434\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435: http:\/\/momjian.us\/main\/writings\/pgsql\/locking.sql) \u041f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \u0431\u044b\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0432 \u0420\u043e\u0441\u0441\u0438\u0438. \u042f \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u0440\u0438\u0435\u0445\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u0443 \u0418\u0432\u0430\u043d\u0430 \u0438 \u0443 \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043b\u0430\u043d\u044b. \u042f, \u043d\u0430\u0434\u0435\u044e\u0441\u044c,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unlocking-the-postgres-lock-manager-bryus-momzhian\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-11T23:42:48+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-11T23:42:48+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Sbloccare il gestore di blocchi Postgres. Bruce Momjian | ProHoster","description":"Trascrizione della presentazione del 2020 di Bruce Momjian \"Sbloccare il gestore di blocchi Postgres\". (Nota: tutte le query SQL dalle diapositive possono essere ottenute tramite questo link: http:\/\/momjian.us\/main\/writings\/pgsql\/locking.sql) Ciao! \u00c8 fantastico essere di nuovo qui in Russia. Mi scuso per non essere potuto venire l'anno scorso, ma quest'anno io e Ivan abbiamo grandi piani. Spero che","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unlocking-the-postgres-lock-manager-bryus-momzhian","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Unlocking the Postgres Lock Manager. \u0411\u0440\u044e\u0441 \u041c\u043e\u043c\u0436\u0438\u0430\u043d | ProHoster","og:description":"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2020 \u0433\u043e\u0434\u0430 \u0411\u0440\u044e\u0441\u0430 \u041c\u043e\u043c\u0436\u0438\u0430\u043d\u0430 &quot;Unlocking the Postgres Lock Manager&quot;. (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0412\u0441\u0435 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 \u0441\u043b\u0430\u0439\u0434\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435: http:\/\/momjian.us\/main\/writings\/pgsql\/locking.sql) \u041f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \u0431\u044b\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0432 \u0420\u043e\u0441\u0441\u0438\u0438. \u042f \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u0440\u0438\u0435\u0445\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u0443 \u0418\u0432\u0430\u043d\u0430 \u0438 \u0443 \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043b\u0430\u043d\u044b. \u042f, \u043d\u0430\u0434\u0435\u044e\u0441\u044c,","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/unlocking-the-postgres-lock-manager-bryus-momzhian","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-11T23:42:48+00:00","article:modified_time":"2020-07-11T23:42:48+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"87954","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:40:34","updated":"2022-09-27 23:56:25"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/87954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=87954"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/87954\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/87955"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=87954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=87954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=87954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}