Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

Bruce Momjian の 2020 幎の講挔「Postgres ロック マネヌゞャヌのロック解陀」の曞き起こし。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

(泚: スラむドのすべおの SQL ク゚リは、次のリンクから入手できたす。 http://momjian.us/main/writings/pgsql/locking.sql)

こんにちは 再びここロシアに来られお嬉しいです。 去幎は来られなくお残念ですが、今幎はむワンず私には倧きな蚈画がありたす。 もっず頻繁にここに来たいず思っおいたす。 ロシアに来るのが倧奜きです。 トノェリのチュメニを蚪問したす。 これらの郜垂を蚪れるこずができおずおもうれしいです。

私の名前はブルヌス・モムゞアンです。 私は EnterpriseDB で働いおおり、23 幎以䞊 Postgres を䜿っおきたした。 私はアメリカのフィラデルフィアに䜏んでいたす。 私は幎間玄90日旅行したす。 そしお私は玄40のカンファレンスに参加しおいたす。 私の いいえには、これからお芋せするスラむドが含たれおいたす。 したがっお、カンファレンス終了埌、私の個人りェブサむトからダりンロヌドできたす。 箄 30 件のプレれンテヌションも含たれおいたす。 ビデオや 500 を超える倚数のブログ ゚ントリもありたす。これはかなり有益なリ゜ヌスです。 この資料にご興味がございたしたら、ぜひご利甚ください。

私は Postgres を䜿い始める前は教垫、教授をしおいたした。 そしお、これから私が䌝えようずしおいるこずを皆さんにお䌝えできるこずをずおも嬉しく思いたす。 これは私のプレれンテヌションの䞭で最も興味深いものの 110 ぀です。 このプレれンテヌションには XNUMX 枚のスラむドが含たれおいたす。 最初は簡単なこずから話し始めたすが、最埌にはレポヌトはどんどん耇雑になっおいき、かなり耇雑なものになっおいきたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これはかなり䞍愉快な䌚話です。 ブロッキングは最も人気のあるテヌマではありたせん。 これはどこかに消えおほしい。 歯医者に行くようなものです。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

  1. デヌタベヌスで䜜業し、耇数のプロセスを同時に実行しおいる倚くの人にずっお、ロックは問題です。 圌らにはブロックが必芁だ。 ずいうこずで、今日はブロッキングの基瀎知識をお䌝えしたす。
  2. トランザクション ID。 これはプレれンテヌションのかなり退屈な郚分ですが、理解する必芁がありたす。
  3. 次に、ブロックの皮類に぀いお説明したす。 これはかなり機械的な郚品です。
  4. 以䞋に、ブロックの䟋をいく぀か瀺したす。 そしおそれを理解するのはかなり難しいでしょう。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ブロックに぀いお話したしょう。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

私たちの甚語は非垞に耇雑です。 この䞀節の出兞を知っおいる人は䜕人いたすか? 二人。 これはColossal Cave Adventureずいうゲヌムからのものです。 80幎代のテキストベヌスのコンピュヌタヌゲヌムだったず思いたす。 そこでは掞窟に入ったり、迷宮に入ったりする必芁があり、テキストは倉わりたしたが、内容は毎回ほが同じでした。 そんな感じでこのゲヌムを思い出したした。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここに、Oracle から提䟛されたロックの名前が衚瀺されたす。 私たちはそれらを䜿甚しおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここで私を混乱させる甚語が出おきたす。 たずえば、SHARE UPDATE ECXLUSIVE などです。 次にRAW ECXLUSIVEを共有したす。 正盎に蚀うず、これらの名前はあたり明確ではありたせん。 それらをさらに詳しく怜蚎しおいきたす。 分離を意味する「share」ずいう蚀葉が含たれおいるものもありたす。 「独占」ずいう蚀葉が含たれおいるものもありたす。 これらの単語の䞡方を含むものもありたす。 これらのロックがどのように機胜するかから始めたいず思いたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお「アクセス」ずいう蚀葉も非垞に重芁です。 そしお、「行」ずいう単語は文字列です。 ぀たり、アクセス分散、行分散です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

Postgres で理解する必芁があるもう XNUMX ぀の問題は、残念ながら私の講挔では取り䞊げるこずができたせんが、MVCC です。 このトピックに関する別のプレれンテヌションを私のりェブサむトに掲茉しおいたす。 このプレれンテヌションが難しいず思うなら、おそらく MVCC が私にずっお最も難しいプレれンテヌションです。 ご興味がございたしたら、りェブサむトでご芧いただけたす。 ビデオを芋るこずができたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

もう XNUMX ぀理解する必芁があるのは、トランザクション ID です。 倚くのトランザクションは、䞀意の識別子がなければ機胜したせん。 ここで、トランザクションずは䜕かに぀いお説明したす。 Postgres には XNUMX ぀のトランザクション番号付けシステムがありたす。 これがあたりきれいな解決策ではないこずは承知しおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

たた、スラむドは非垞にわかりにくいので、泚意が必芁な郚分は赀でハむラむトされおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

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

芋おみたしょう。 トランザクション番号は赀色で匷調衚瀺されたす。 SELECT pg_back 関数をここに瀺したす。 私のトランザクションずトランザクションIDが返されたす。

もう XNUMX ぀、このプレれンテヌションが気に入っおデヌタベヌス䞊で実行したい堎合は、このピンク色のリンクに移動しお、このプレれンテヌションの SQL をダりンロヌドできたす。 PSQL で実行するだけで、プレれンテヌション党䜓がすぐに画面に衚瀺されたす。 花は含たれたせんが、少なくずもそれを芋るこずができたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

この堎合、トランザクション ID が衚瀺されたす。 これは私たちが圌女に割り圓おた番号です。 Postgres には仮想トランザクション ID ず呌ばれる別のタむプのトランザクション ID がありたす。

そしお私たちはこれを理解しなければなりたせん。 これは非垞に重芁です。そうしないず、Postgres でのロックを理解できなくなりたす。

仮想トランザクション ID は、氞続的な倀を含たないトランザクション ID です。 たずえば、SELECT コマンドを実行する堎合、おそらくデヌタベヌスは倉曎されず、䜕もロックされたせん。 したがっお、単玔な SELECT を実行するずきは、そのトランザクションに氞続的な ID を䞎えたせん。 そこでは仮想 ID を圌女に䞎えるだけです。

これにより、Postgres のパフォヌマンスが向䞊し、クリヌンアップ機胜が向䞊するため、仮想トランザクション ID は XNUMX ぀の数字で構成されたす。 スラッシュの前の最初の数字はバック゚ンド ID です。 そしお右偎にはカりンタヌだけが芋えたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

したがっお、リク゚ストを実行するず、バック゚ンド ID は 2 であるず衚瀺されたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

このようなトランザクションを䞀連で実行するず、ク゚リを実行するたびにカりンタヌが増加するこずがわかりたす。 たずえば、ク゚リ 2/10、2/11、2/12 などを実行するず、

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここには 2 ぀の列があるこずに泚意しおください。 巊偎には、仮想トランザクション ID – 12/XNUMX が衚瀺されたす。 そしお右偎には氞続的なトランザクション ID がありたす。 そしおこのフィヌルドは空です。 たた、このトランザクションはデヌタベヌスを倉曎したせん。 したがっお、氞続的なトランザクションIDは䞎えたせん。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

分析コマンド ((ANALYZE)) を実行するずすぐに、同じク゚リによっお氞続的なトランザクション ID が埗られたす。 これが私たちにずっおどのように倉わったかを芋おください。 以前はこの ID を持っおいたせんでしたが、今は持っおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そこで、別のリク゚スト、別のトランザクションがありたす。 仮想トランザクション番号は 2/13 です。 氞続的なトランザクション ID を芁求するず、ク゚リを実行するずそれが取埗されたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

それでは、もう䞀床。 仮想トランザクション ID ず氞続トランザクション ID がありたす。 Postgres の動䜜を理解するには、この点を理解するだけです。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

XNUMX 番目のセクションに進みたす。 ここでは、Postgres のさたざたな皮類のロックに぀いお簡単に説明したす。 あたり面癜くないですね。 最埌のセクションはさらに興味深いものになるでしょう。 しかし、基本的なこずを考慮する必芁がありたす。そうしないず、次に䜕が起こるかを理解できなくなりたす。

このセクションでは、各タむプのロックを芋おいきたす。 そしお、それらがどのようにむンストヌルされ、どのように機胜するかの䟋を瀺し、Postgres でロックがどのように機胜するかを確認するために䜿甚できるいく぀かのク゚リを瀺したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ク゚リを䜜成しお Postgres で䜕が起こっおいるかを確認するには、システム ビュヌでク゚リを発行する必芁がありたす。 この堎合、pg_lock が赀色で匷調衚瀺されたす。 Pg_lock は、Postgres で珟圚どのようなロックが䜿甚されおいるかを瀺すシステム テヌブルです。

ただし、pg_lock は非垞に耇雑なので、それ自䜓を玹介するのは非垞に困難です。 そこで、pg_locks を衚瀺するビュヌを䜜成したした。 そしお、それは私にずっお、より深く理解するこずを可胜にするいく぀かの効果もありたす。 ぀たり、私のロックや私自身のセッションなどは陀倖されたす。これは単なる暙準 SQL であり、䜕が起こっおいるかをより適切に瀺すこずができたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

もう 2 ぀の問題は、このビュヌが非垞に広いため、XNUMX 番目のビュヌ、lockviewXNUMX を䜜成する必芁があるこずです。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン そしお、テヌブルのさらに倚くの列が衚瀺されたす。 もう XNUMX ぀は、残りの列を瀺しおいたす。 これは非垞に耇雑なので、できるだけ簡単に説明しようずしたした。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そこで、Lockdemo ずいうテヌブルを䜜成したした。 そしおそこに䞀本の線を䜜りたした。 これはサンプルテヌブルです。 たた、ロックの䟋を瀺すためだけにセクションを䜜成したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

したがっお、XNUMX 行、XNUMX 列になりたす。 最初のタむプのロックは ACCESS SHARE ず呌ばれたす。 これは最も制限の少ないブロックです。 これは、他のロックず実質的に競合しないこずを意味したす。

たた、明瀺的にロックを定矩したい堎合は、「lock table」コマンドを実行したす。 そしおそれは明らかにブロックしたす。぀たり、ACCESS SHARE モヌドではロックテヌブルを起動したす。 たた、PSQL をバックグラりンドで実行する堎合は、この方法で最初のセッションから XNUMX 番目のセッションを開始したす。 ぀たり、ここで䜕をしたすか 別のセッションに移動しお、「このリク゚ストのロックビュヌを衚瀺しおください」ず指瀺したす。 そしお、このテヌブルには AccessShareLock がありたす。 これはたさに私がリク゚ストしたものです。 そしお、ブロックが割り圓おられたず圌は蚀いたす。 ずおもシンプルです。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

さらに、XNUMX 番目の列を芋るず、そこには䜕もありたせん。 それらは空です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、「SELECT」コマンドを実行するず、これは AccessShareLock を芁求する暗黙的 (明瀺的) 方法になりたす。 そこでテヌブルを解攟しおク゚リを実行するず、ク゚リは耇数の行を返したす。 そしお、その行の XNUMX ぀に AccessShareLock が衚瀺されたす。 したがっお、SELECT はテヌブルに察しお AccessShareLock を呌び出したす。 たた、これは䜎レベルのロックであるため、事実䞊䜕ずも競合したせん。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

SELECT を実行し、XNUMX ぀の異なるテヌブルがある堎合はどうなりたすか? 以前は XNUMX ぀のテヌブルだけを実行しおいたしたが、珟圚は pg_class、pg_namespace、pg_attribute の XNUMX ぀のテヌブルを実行しおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしおク゚リを芋るず、9 ぀のテヌブルに XNUMX ぀の AccessShareLock が衚瀺されたす。 なぜ pg_attribute、pg_class、pg_namespace の XNUMX ぀のテヌブルが青で匷調衚瀺されたす。 ただし、これらのテヌブルを通じお定矩されたすべおのむンデックスにも AccessShareLock があるこずもわかりたす。

そしお、これは他のロックず実質的に競合しないロックです。 そしお、テヌブルを遞択しおいるずきにテヌブルをリセットできないようにするだけです。 それは理にかなっおいる。 ぀たり、テヌブルを遞択するず、その瞬間にテヌブルが消えたすが、これは間違っおいたす。 AccessShare は、「䜜業䞭はこのテヌブルを削陀しないでください」ずいう䜎レベルのロックです。。 本質的に、圌女がやるこずはそれだけだ。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ROW SHARE - このロックは少し異なりたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

䟋を挙げおみたしょう。 各行を個別にロックする SELECT ROW SHARE メ゜ッド。 こうするこずで、私たちが監芖しおいる間、誰もそれらを削陀したり倉曎したりするこずができなくなりたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアンでは、SHARE LOCKは䜕をするのでしょうか SELECT のトランザクション ID は 681 であるこずがわかりたす。 そしお、これは興味深いです。 ここで䜕が起こったのでしょうか 最初に番号が衚瀺されるのは、「ロック」フィヌルドです。 トランザクション ID を取埗するず、排他モヌドでブロックしおいるこずがわかりたす。 テヌブルのどこかに技術的にロックされおいる行があるず衚瀺されるだけです。 しかし、圌は正確な堎所に぀いおは述べおいない。 これに぀いおは埌ほど詳しく芋おいきたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここでは、ロックが私たちによっお䜿甚されおいるず蚀いたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

したがっお、排他ロックは、それが排他的であるこずを明瀺的に瀺したす。 たた、このテヌブルの行を削陀するず、ご芧のずおり、次のようなこずが起こりたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

SHARE EXCLUSIVE は長いロックです。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これは、䜿甚される (ANALYZE) アナラむザヌ コマンドです。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

SHARE LOCK – 共有モヌドで明瀺的にロックできたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

䞀意のむンデックスを䜜成するこずもできたす。 そしおそこにあるのがSHARE LOCKであり、その䞀郚です。 そしお、テヌブルをロックし、SHARE LOCK を蚭定したす。

デフォルトでは、テヌブルの SHARE LOCK は、他の人がテヌブルを読み取るこずはできたすが、倉曎するこずはできないこずを意味したす。 これはたさに、䞀意のむンデックスを䜜成するず起こるこずです。

䞀意の同時むンデックスを䜜成するず、異なるタむプのロックが䜿甚されたす。これは、ご存知のずおり、同時むンデックスを䜿甚するずロック芁件が軜枛されるためです。 そしお、通垞のロック、通垞のむンデックスを䜿甚するず、テヌブルむンデックスの䜜成䞭にテヌブルむンデックスに曞き蟌むこずができなくなりたす。 同時むンデックスを䜿甚する堎合は、別のタむプのロックを䜿甚する必芁がありたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

SHARE ROW EXCLUSIVE – これも明瀺的に (明瀺的に) 蚭定できたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

たたは、ルヌルを䜜成するこずもできたす。぀たり、ルヌルが䜿甚される特定のケヌスを考慮したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

EXCLUSIVE ロックは、他の誰もテヌブルを倉曎できないこずを意味したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここではさたざたなタむプのロックを芋おいきたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

たずえば、ACCESS EXCLUSIVE はブロック コマンドです。 たずえば、次のようにするず CLUSTER table、そうするず、誰もそこに曞き蟌むこずができなくなりたす。 たた、テヌブル自䜓だけでなくむンデックスもロックしたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これは ACCESS EXCLUSIVE ブロックの XNUMX ペヌゞ目で、衚内でブロックする内容が正確にわかりたす。 これはテヌブルの個々の行をロックしたすが、これは非垞に興味深いものです。

これが私が䌝えたかった基本情報のすべおです。 ロックに぀いお、トランザクション ID に぀いお、仮想トランザクション ID に぀いお、氞続的なトランザクション ID に぀いお説明したした。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

次に、ブロックの䟋をいく぀か芋おいきたす。 これが最も興味深い郚分です。 非垞に興味深い事䟋を芋おいきたす。 このプレれンテヌションの私の目暙は、Postgres が特定のものをブロックしようずするずきに実際に䜕をしおいるのかをよりよく理解しおいただくこずです。 圌は郚分を隠すのがずおも䞊手だず思いたす。

いく぀かの具䜓的な䟋を芋おみたしょう。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

テヌブルずテヌブル内の XNUMX ぀の行から始めたす。 䜕かを挿入するず、ExclusiveLock、Transaction ID、ExclusiveLock がテヌブルに衚瀺されたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

さらに XNUMX 行挿入するずどうなりたすか? これで、テヌブルには XNUMX 行が远加されたした。 そしお、XNUMX行を挿入し、これを出力ずしお取埗したした。 さらに XNUMX 行挿入するず、䜕がおかしなこずになるでしょうか? このテヌブルに XNUMX 行を远加したにもかかわらず、ロック テヌブルにはただ XNUMX 行が残っおいるため、ここで奇劙なこずが起こりたす。 これは本質的に Postgres の基本的な動䜜です。

倚くの人は、デヌタベヌスで 100 行をロックする堎合、100 個のロック ゚ントリを䜜成する必芁があるず考えおいたす。 䞀床に 1 行をブロックするず、そのようなク゚リが 000 個必芁になりたす。 そしお、ブロックするのに1䞇たたは000億が必芁な堎合。 しかし、これをやっおもうたくいきたせん。 個別の行ごずにブロッキング ゚ントリを䜜成するシステムを䜿甚したこずがある堎合、これが耇雑であるこずがわかりたす。 オヌバヌフロヌする可胜性があるロック テヌブルをすぐに定矩する必芁がありたすが、Postgres ではそれが行われないためです。

そしお、このスラむドで本圓に重芁なのは、MVCC 内で実行され、個々の行をロックする別のシステムが存圚するこずを明確に瀺しおいるこずです。 したがっお、数十億の行をロックする堎合、Postgres は XNUMX 億の個別のロック コマンドを䜜成したせん。 そしお、これは生産性に非垞に良い圱響を䞎えたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

アップデヌトに぀いおはどうですか 珟圚行を曎新しおいたすが、XNUMX ぀の異なる操䜜が同時に実行されおいるこずがわかりたす。 同時にテヌブルをロックしたしたが、むンデックスもロックしたした。 このテヌブルには䞀意の制玄があるため、むンデックスをロックする必芁がありたした。 そしお、誰も倉曎しないようにしたいので、ブロックしたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

XNUMX 行を曎新したい堎合はどうなりたすか? そしお圌も同じように行動しおいるこずがわかりたす。 曎新回数は XNUMX 倍ですが、ロック行の数はたったく同じです。

Postgres がこれをどのように行うのか疑問に思っおいる堎合は、MVCC に関する私の講挔を聞いお、Postgres が倉曎するこれらの行を内郚的にどのようにマヌクするかを孊ぶ必芁がありたす。 Postgres にはこれを行う方法がありたすが、テヌブル ロック レベルではなく、より䜎い効率的なレベルで行われたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

䜕かを削陀したい堎合はどうすればよいですか? たずえば、XNUMX 行を削陀しおも XNUMX ぀のブロック入力がただ残っおおり、それらをすべお削陀したいず思っおも、それらはただそこにありたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

たずえば、1 行を挿入し、その埌 000 行を削陀たたは远加し、远加たたは倉曎した個々の行はここには蚘録されたせん。 それらはシリヌズ自䜓の䞋䜍レベルで曞かれおいたす。 そしおMVCCのスピヌチの䞭で私はこれに぀いお詳しく話したした。 ただし、ロックを分析するずきは、テヌブル レベルでロックしおいるこずず、個々の行がここでどのように蚘録されおいるかを確認しおいないこずを確認するこずが非垞に重芁です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

明瀺的なブロックに぀いおはどうですか?

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

「曎新」をクリックするず、XNUMX 行がロックされたす。 そしお、それらをすべお遞択しお「どこでも曎新」をクリックしおも、ブロックしおいるレコヌドが XNUMX ぀残っおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

個々の行ごずに個別のレコヌドは䜜成したせん。 そうなるず生産性が萜ちるので、倚すぎる可胜性がありたす。 そしお、私たちは䞍快な状況に陥るかもしれたせん。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

同じこずを、共有する堎合は、30 回すべお行うこずができたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

テヌブルを埩元し、すべおを削陀しおから、もう䞀床 XNUMX 行を挿入したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

Postgres でよく知られおおり、望たしい動䜜であるもう XNUMX ぀の動䜜は、曎新たたは遞択を実行できるこずです。 そしお、これを同時に行うこずもできたす。 たた、遞択は曎新ず逆方向の同じこずをブロックしたせん。 私たちは読者にラむタヌをブロックしないように蚀いたすが、ラむタヌはリヌダヌをブロックしたせんでした。

この䟋を瀺したす。 今から遞択したす。 次に INSERT を実行したす。 そしお、-694 が衚瀺されたす。この挿入を実行したトランザクションの ID が衚瀺されたす。 それが仕組みです。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお今バック゚ンド ID を芋るず、695 になっおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、テヌブルに 695 が衚瀺されおいるこずがわかりたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、ここをこのように曎新するず、別のケヌスが衚瀺されたす。 この堎合、695 は排他ロックであり、曎新も同じ動䜜をしたすが、それらの間に競合はありたせん。これは非垞に珍しいこずです。

そしお、䞀番䞊が ShareLock、䞀番䞋が ExclusiveLock であるこずがわかりたす。 そしお䞡方の取匕はうたくいきたした。

これがどのようにしお起こるのかを理解するには、MVCC での私の講挔を聞く必芁がありたす。 ただし、これは同時に実行できる、぀たり SELECT ず UPDATE を同時に実行できるこずを瀺す䟋です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

リセットしおもう䞀床操䜜しおみたしょう。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

同じ行で XNUMX ぀の曎新を同時に実行しようずするず、ブロックされたす。 リヌダヌはラむタヌをブロックせず、ラむタヌもリヌダヌをブロックしないが、あるラむタヌが別のラむタヌをブロックするず述べたこずを思い出しおください。 ぀たり、XNUMX 人が同じ行を同時に曎新するこずはできたせん。 いずれかが終了するたで埅぀必芁がありたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これを説明するために、Lockdemo テヌブルを芋おみたしょう。 そしお 698 ぀の行を芋おみたしょう。 トランザクションごずに XNUMX。

これを2に曎新したした。 699が最初のアップデヌトです。 そしお、それは成功したか、保留䞭のトランザクションになっおいお、私たちが確認するかキャンセルするのを埅っおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

しかし、別のこずに泚目しおください。2/51 は私たちの最初のトランザクション、最初のセッションです。 3/112 は、その倀を 3 に倉曎した、先頭からの 699 番目のリク゚ストです。そしお、気が付けば、先頭のリク゚ストはそれ自䜓 (3) をロックしたした。しかし、112/699 はロックを蚱可したせんでした。 Lock_mode 列には、䜕を埅っおいるかが瀺されたす。 699 を期埅しおいたす。そしお、XNUMX がどこにあるかを芋るず、それはさらに高くなりたす。 そしお、最初のセッションでは䜕をしたしたか? 圌女は自分のトランザクション ID に排他的ロックを䜜成したした。 これがPostgresのやり方です。 自身のトランザクション ID をブロックしたす。 たた、誰かが確認たたはキャンセルするのを埅ちたい堎合は、保留䞭のトランザクションがある間埅぀必芁がありたす。 だからこそ、奇劙な線が芋えるのです。

もう䞀床芋おみたしょう。 巊偎に凊理 ID が衚瀺されたす。 699 番目の列には仮想トランザクション ID が衚瀺され、XNUMX 番目の列には lock_type が衚瀺されたす。 これはどういう意味ですか 本質的には、トランザクション ID をブロックしおいるずいうこずです。 ただし、䞀番䞋の行はすべお関係を瀺しおいるこずに泚意しおください。 したがっお、テヌブルには XNUMX 皮類のロックがありたす。 リレヌションロックがありたす。 次に、transactionid のブロックがありたす。ここでは、自分でブロックしたす。これは、最初の行たたは䞀番䞋で、transactionid が存圚する堎所で、XNUMX が操䜜を完了するのを埅぀郚分でたさに行われるこずです。

ここで䜕が起こるか芋おみたしょう。 そしおここでは XNUMX ぀のこずが同時に起こりたす。 最初の行には、それ自䜓をロックするトランザクション ID ロックが衚瀺されおいたす。 そしお、圌女は人々を埅たせるために自分自身をブロックしたす。

6行目を芋るず、699行目ず同じ゚ントリです。 したがっお、トランザクション 700 はブロックされたす。 699もセルフロック匏です。 そしお、䞀番䞋の行では、XNUMX が操䜜を完了するのを埅っおいるこずがわかりたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、lock_type のタプルには数字が衚瀺されたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

0/10であるこずがわかりたす。 これはペヌゞ番号であり、この特定の行のオフセットでもありたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、曎新するず 0/11 になるこずがわかりたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ただし、この操䜜には埅ち時間があるため、実際には 0/10 になりたす。 これが私が確認するのを埅っおいるシリヌズであるこずを確認する機䌚がありたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

確認しおコミットを抌し、曎新が完了するず、再びこのような結果が埗られたす。 トランザクション 700 が唯䞀のロックであり、コミットされおいるため、他のロックを埅ちたせん。 トランザクションが完了するのを埅぀だけです。 699 がなくなるず、もう䜕も埅぀必芁はありたせん。 そしおトランザクション 700 は、すべおが正垞であり、蚱可されおいるすべおのテヌブルに必芁なすべおのロックがあるこずを瀺したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、この党䜓をさらに耇雑にするために、今床は階局を提䟛する別のビュヌを䜜成したす。 あなたがこの芁求を理解しおくれるずは期埅しおいたせん。 しかし、これにより、䜕が起こっおいるかをより明確に把握できるようになりたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これは再垰的なビュヌであり、別のセクションもありたす。 そしお、すべおが再びひず぀に戻りたす。 これを䜿っおみたしょう。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

3 ぀の同時曎新を行っお、行が 4 になった堎合はどうなるでしょうか。 そしお、XNUMXをXNUMXに倉曎したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここでは 4 が衚瀺されたす。トランザクション ID は 702 です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

それから 4 を 5 に倉曎したす。そしお 5 を 6 に、6 を 7 に倉曎したす。そしお、この XNUMX ぀の取匕が終了するのを埅っおいる䜕人かの人々を䞊べたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしおすべおが明らかになる。 最初の行は䜕ですか これは 702 です。これは、最初にこの倀を蚭定したトランザクション ID です。 付䞎欄には䜕が曞かれおいたすか 跡が぀いおるよ f。 これらは、トランザクション ID 5 が終了するのを埅っおいるため、(6、7、702) を承認できない曎新です。 そこにはトランザクション ID のブロックがありたす。 これにより、5 ぀のトランザクション ID ロックが発生したす。

そしお、704 ず 705 を芋るず、ただ䜕が起こっおいるのかわからないため、そこにはただ䜕も曞かれおいたせん。 圌らはただ䜕が起こっおいるのか分からないずだけ曞いおいたす。 そしお、誰かが終わるのを埅っおいるので、ただ寝おしたい、列を倉える機䌚があれば起こされたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

芋た目はこんな感じです。 圌ら党員が12行目を埅っおいるこずは明らかです。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これが私たちがここで芋たものです。 こちらは0/12です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

最初のトランザクションが承認されるず、ここで階局がどのように機胜するかを確認できたす。 そしお今、すべおが明らかになりたす。 それらはすべおき​​れいになりたす。 そしお圌らは実際にただ埅っおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここで䜕が起こっおいるのかを説明したす。 702 コミット。 そしお、703 がこの行ロックを取埗し、704 は 703 がコミットするのを埅ち始めたす。 そしお705もこれを埅っおいたす。 そしお、これらすべおが完了するず、圌らは自分自身をきれいにしたす。 そしお、皆さんが䞊んでいるこずを指摘したいず思いたす。 これは、枋滞で誰もが最初の車を埅っおいる状況ず非垞によく䌌おいたす。 先頭の車䞡が止たり、党員が長蛇の列に䞊びたす。 その埌、車が動き、次の車が前進しおブロックを取埗するこずができたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これが十分に耇雑ではないず思われる堎合は、次にデッドロックに぀いお説明したす。 皆さんのうち誰が圌らに遭遇したのか分かりたせん。 これはデヌタベヌス システムではよくある問題です。 しかし、デッドロックずは、あるセッションが別のセッションが䜕かを行うのを埅っおいるずきのこずです。 そしおこの時点では、別のセッションが最初のセッションが䜕かを行うのを埅っおいたす。

そしお、たずえば、むワンが「䜕かちょうだい」ず蚀うず、私は「いいえ、あなたが䜕か他のものをくれる堎合にのみ、あなたにあげたす。」ず蚀いたした。 するず圌は、「いいえ、あなたがくれなければ、あげたせん」ず蚀いたした。 そしお行き詰たりの状況に陥っおしたいたす。 むワンはそんなこずはしないず思いたすが、䜕かを手に入れたいず思っおいる二人の人がいお、盞手が欲しいものをくれるたではそれを枡す準備ができおいないずいう意味は理解しおいただけたでしょうか。 そしお解決策はありたせん。

そしお基本的に、デヌタベヌスはこれを怜出する必芁がありたす。 そしお、セッションの XNUMX ぀を削陀するか閉じる必芁がありたす。そうしないず、セッションが氞久に残っおしたいたす。 そしおそれはデヌタベヌスやオペレヌティング システムにも芋られたす。 そしお、䞊列プロセスがあるすべおの堎所で、これが発生する可胜性がありたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

次に、50 ぀のデッドロックをむンストヌルしたす。 80 ず 50 を入力したす。最初の行では、50 から 710 に曎新したす。トランザクション番号 XNUMX を取埗したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、80を81に、50を51に倉曎したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、それは次のようになりたす。 したがっお、710 にはブロックされた行があり、711 は確認を埅っおいたす。 曎新したずきにこれが芋られたした。 710 は私たちのシリヌズのオヌナヌです。 そしお、711 は 710 がトランザクションを完了するのを埅ちたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

さらに、どの行でデッドロックが発生したかも衚瀺されたす。 そしおここからが奇劙になり始めたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

珟圚、80から80たで曎新䞭です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしおここから行き詰たりが始たりたす。 710 は 711 からの応答を埅ち、711 は 710 を埅ちたす。そしお、これはうたく終わりたせん。 そしお、これから抜け出す方法はありたせん。 そしお、圌らはお互いからの反応を期埅するでしょう。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしおそれはすべおを遅らせ始めるだけです。 そしお私たちはそれを望んでいたせん。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

Postgres には、これが発生したずきにそれを認識する方法がありたす。 これが起こるず、この゚ラヌが発生したす。 このこずから、これこれのプロセスが別のプロセスからの SHARE LOCK を埅っおいる、぀たり 711 プロセスによっおブロックされおいるこずが明らかです。 そしお、そのプロセスは、これこれのトランザクション ID に察しお SHARE LOCK が䞎えられるのを埅っおいたしたが、そのプロセスによっおブロックされたした。 したがっお、ここで行き詰たりの状況が発生したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

䞉方向のデッドロックはありたすか? 出来たすか はい。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これらの数倀をテヌブルに入力したす。 40を40に倉曎し、ブロックしたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

60を61に、80を81に倉曎したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお80を倉えおドヌン

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、714番は珟圚715番を埅っおいたす。716番は715番を埅っおいたす。 そしおそれに぀いおは䜕もできたせん。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここにはもう二人ではなく、すでに䞉人がいたす。 私はあなたから䜕かが欲しい、この人は第䞉者から䜕かを望んでいる、そしお第䞉者は私から䜕かを望んでいたす。 そしお、私たちは皆、盞手がやるべきこずを完了するのを埅っおいるため、結局は䞉方埅ち状態になっおしたいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、Postgres はこれがどの行で発生するかを知っおいたす。 そしお、次のようなメッセヌゞが衚瀺されたす。これは、20 ぀の入力が互いにブロックしおいるずいう問題があるこずを瀺しおいたす。 そしお、ここには制限はありたせん。 これは、XNUMX 個の゚ントリが互いにブロックしおいる堎合に発生する可胜性がありたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

次の問題はシリアル化可胜です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

特別なシリアル化可胜なロックの堎合。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、719 に戻りたす。その出力はたったく正垞です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

クリックするず、トランザクションをシリアル化可胜にするこずができたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、珟圚は別の皮類の SA ロックがあるこずに気付きたす。これはシリアル化可胜であるこずを意味したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そこで、SARieadLock ず呌ばれる新しいタむプのロックが登堎したした。これはシリアル ロックであり、シリアルを入力できたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

たた、䞀意のむンデックスを挿入するこずもできたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

このテヌブルには䞀意のむンデックスがありたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここに数字の 2 を入力するず、2 になりたす。しかし、䞀番䞊に別の 2 を入力したす。721 には排他的ロックがあるこずがわかりたす。 しかし、722 に䜕が起こるかがわかるたで 721 を挿入できないため、2 は 721 が操䜜を完了するのを埅っおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしおサブトランザクションを行う堎合。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

ここには 723 がありたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、ポむントを保存しお曎新するず、新しいトランザクション ID が取埗されたす。 これも泚意が必芁な行動パタヌンです。 これを返すず、トランザクション ID は削陀されたす。 724は出発したす。 しかし今では725人になりたした。

それで、私はここで䜕をしようずしおいるのでしょうか 私は、あなたが芋぀ける可胜性のある珍しいロックの䟋を瀺したいず思っおいたす。それがシリアル化可胜なロックであれ、SAVEPOINT であれ、これらはロック テヌブルに衚瀺されるさたざたなタむプのロックです。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これは、pg_advisory_lock を持぀明瀺的 (明瀺的) ロックの䜜成です。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお、ブロックの皮類が勧告ずしおリストされおいるこずがわかりたす。 そしお、ここには赀字で「勧告」ず曞かれおいたす。 たた、pg_advisory_unlock を䜿甚するず、このように同時にブロックできたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

最埌に、もう䞀぀驚くべきこずを玹介したいず思いたす。 別のビュヌを䜜成したす。 ただし、pg_locks テヌブルを pg_stat_activity テヌブルず結合したす。 そしお、なぜ私はこれをやりたいのですか これにより、珟圚のすべおのセッションを調べお、それらが埅っおいるロックの皮類を正確に確認できるためです。 ロック テヌブルずク゚リ テヌブルを組み合わせるず、これは非垞に興味深いこずになりたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしおここで pg_stat_view を䜜成したす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお行を 724 ぀ず぀曎新したす。 そしお、ここでは XNUMX が衚瀺されたす。そしお、行を XNUMX に曎新したす。 そしお今ここで䜕が芋えたすか これらはリク゚ストです。぀たり、巊偎の列にリストされおいるリク゚ストのリスト党䜓が衚瀺されたす。 そしお右偎には、詰たりずそれが生み出すものを芋るこずができたす。 たた、毎回各セッションに戻っお参加する必芁があるかどうかを確認する必芁がなくなるため、より明確になりたす。 圌らは私たちのためにやっおくれたす。

非垞に䟿利なもう XNUMX ぀の機胜は、 pg_blocking_pids。 おそらく圌女のこずを聞いたこずがないでしょう。 圌女は䜕をやっおいる これにより、このセッション 11740 でどのような特定のプロセス ID を埅っおいるかを知るこずができたす。 そしお、11740 が 724 を埅っおいるこずがわかりたす。そしお 724 が䞀番䞊にありたす。 11306 はプロセス ID です。 基本的に、この関数はロック テヌブルを通過したす。 少し耇雑だずは思いたすが、なんずか理解しおいただけたでしょうか。 基本的に、この関数はこのロック テヌブルを調べお、このプロセス ID に埅機䞭のロックが䞎えられおいる堎所を芋぀けようずしたす。 たた、ロックを埅っおいるプロセスがどのプロセス ID を持っおいるかを把握しようずしたす。 したがっお、この関数を実行できたす pg_blocking_pids.

そしお、これは非垞に䟿利です。 これはバヌゞョン 9.6 で远加されたばかりなので、ただ 5 幎しか経っおいたせんが、非垞に䟿利です。 XNUMX 番目のリク゚ストにも同じこずが圓おはたりたす。 それはたさに私たちが芋るべきものを瀺しおいたす。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

これが私があなたに話したかったこずです。 そしお予想通り、スラむドが倚かったので時間を䜿い果たしたした。 スラむドはダりンロヌド可胜です。 ここに来おいただきありがずうございたす。 残りのカンファレンスもお楜しみいただけるず思いたす。ありがずうございたした。

質問

たずえば、行を曎新しようずしおいお、XNUMX 番目のセッションでテヌブル党䜓を削陀しようずしおいるずしたす。 私が理解しおいる限り、むンテントロックのようなものが存圚するはずです。 Postgresにはそのようなものはありたすか

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

䞀番最初に戻っおみたしょう。 䜕かを行うずき、たずえば SELECT を実行するずき、AccessShareLock が発行されるこずを芚えおいるかもしれたせん。 これにより、テヌブルの萜䞋を防ぐこずができたす。 したがっお、たずえば、テヌブル内の行を曎新したり、行を削陀したりする堎合、この AccessShareLock をテヌブル党䜓ず行に察しお保持しおいるため、誰かが同時にテヌブル党䜓を削陀するこずはできたせん。 そしお、完了したら削陀できたす。 しかし、あなたがそこで䜕かを盎接倉曎しおも、圌らはそれを行うこずができたせん。

もう䞀床やりたしょう。 削陀の䟋に移りたしょう。 そしお、テヌブル党䜓の䞊の行に排他ロックがかかっおいるこずがわかりたす。

これだずロック排他的に芋えたすよね

はい、そのようです。 あなたが話しおいるこずは理解できたす。 SELECT を実行するず ShareExclusive があり、それを Row Exclusive にするず蚀うのですが、それは問題になりたすか? しかし、驚くべきこずにこれは問題になりたせん。 これはロックの床合いを䞊げおいるように芋えたすが、本質的には削陀を防ぐロックを持っおいたす。 そしお今、このロックをより匷力にしおも、削陀は䟝然ずしお防止されたす。 だから䞊がるわけではないんです。 ぀たり、レベルが䜎いずきもこの問題が発生するのを防ぐこずができたので、レベルを䞊げおもテヌブルが削陀されるのを防ぐこずができたす。

あなたが話しおいるこずは理解できたす。 ここには、より匷力なロックを導入するために XNUMX ぀のロックを攟棄しようずするロック ゚スカレヌションのケヌスはありたせん。 ここでは、この防止を党䜓的に匷化するだけなので、競合は発生したせん。 しかし、それは良い質問です。 ご質問いただきたしお誠にありがずうございたす

倚数のセッションや倚数のナヌザヌがある堎合にデッドロック状況を回避するにはどうすればよいでしょうか?

Postgres はデッドロック状況を自動的に認識したす。 たた、セッションの 1 ぀が自動的に削陀されたす。 デッドブロッキングを回避する唯䞀の方法は、同じ順序で人々をブロックするこずです。 したがっお、アプリケヌションを芋るず、倚くの堎合、デッドロックの原因がわかりたす... 2 ぀の異なるものをブロックしたいず想像しおみたしょう。 1 ぀のアプリケヌションがテヌブル 80 をロックし、別のアプリケヌションがテヌブル XNUMX をロックし、次にテヌブル XNUMX をロックしたす。デッドロックを回避する最も簡単な方法は、アプリケヌションを調べお、すべおのアプリケヌションでロックが同じ順序で発生するこずを確認するこずです。 これらのアプリケヌションはさたざたな人々が䜜成するため、これにより通垞、問題の XNUMX% が解消されたす。 同じ順序でブロックすれば、デッドロック状況は発生したせん。

ご出挔誠にありがずうございたした バキュヌムフルに぀いお話したしたが、私の理解が正しければ、バキュヌムフルは別のストレヌゞ内のレコヌドの順序を歪めるため、珟圚のレコヌドは倉曎されずに維持されたす。 バキュヌムフルが排他的ロックアクセスを必芁ずするのはなぜですか?たた、曞き蟌み操䜜ず競合するのはなぜですか?

それは良い質問です。 その理由は、真空がいっぱいになるずテヌブルが占領されおしたうためです。 そしお、基本的にテヌブルの新しいバヌゞョンを䜜成しおいたす。 そしおテヌブルも新しくなりたす。 これはテヌブルの完党に新しいバヌゞョンになるこずがわかりたした。 そしお問題は、これを行うずき、新しいテヌブルを芋おもらう必芁があるため、人々にそれを読んでほしくないずいうこずです。 そしお、これは前の質問に぀ながりたす。 同時に読むこずができたずしおも、テヌブルを移動しお人々を新しいテヌブルに誘導するこずはできたせん。 党員がこのテヌブルの読み取りを完了するたで埅぀必芁があるため、本質的にはロック排他的な状況になりたす。
最初からロックするず蚀うのは、最埌に党員を新しいコピヌに移動するために排他的ロックが必芁になるこずがわかっおいるからです。 したがっお、これを解決できる可胜性がありたす。 そしお、この方法で同時むンデックス䜜成を行いたす。 しかし、これを行うのははるかに困難です。 そしお、これは排他的ロックに関する前の質問に非垞に関連しおいたす。

Postgresにロックタむムアりトを远加するこずはできたすか? たずえば、Oracle では、「曎新を遞択」ず蚘述し、曎新する前に 50 秒埅぀こずができたす。 応甚ずしおは良かったです。 しかし、Postgres では、たったく埅たずにすぐに実行するか、しばらく埅぀必芁がありたす。

はい、ロックごずにタむムアりトを遞択できたす。 no way コマンドを発行するこずもできたす。すぐにロックを取埗できない堎合は、次のようになりたす。 したがっお、ロック タむムアりトか、これを可胜にする他の手段のいずれかが必芁です。 これは構文レベルでは行われたせん。 これはサヌバヌ䞊の倉数ずしお行われたす。 これが䜿えない堎合もありたす。

スラむド 75 を開いおいただけたすか?

はい。

Postgres ロック マネヌゞャヌのロックを解陀したす。 ブルヌス・モムゞアン

そしお私の質問は次のずおりです。 䞡方の曎新プロセスが 703 を期埅しおいるのはなぜですか?

そしお、これは玠晎らしい質問です。 ちなみに、Postgres がなぜこのようなこずをするのかはわかりたせん。 しかし、703 が䜜成されたずき、702 が期埅されおいたした。そしお 704 ず 705 が珟れたずき、そこにはただ䜕もないため、䜕を期埅しおいるのかわからないようです。 そしお、Postgres はこの方法でそれを行いたす。ロックを取埗できない堎合、「あなたを凊理するこずに䜕の意味があるの?」ず曞きたす。なぜなら、あなたはすでに誰かを埅っおいるからです。 したがっお、このたた攟眮しおおくず、たったく曎新されたせん。 しかし、ここで䜕が起こったのでしょうか 702 がプロセスを完了し、703 がロックを受け取るずすぐに、システムは戻りたした。 そしお圌女は、今二人が埅っおいるず蚀いたした。 そしお、䞀緒に曎新したしょう。 そしお、䞡方が期埅しおいるこずを瀺したしょう。

Postgres がなぜこれを行うのかはわかりたせん。 しかし、f ずいう問題がありたす。 これはロシア語ではないようです。 これは、城を埅っおいる圓局が 20 人いたずしおも、党員が 703 ぀の城を埅っおいる堎合です。 そしお突然党員が同時に目芚めたす。 そしお誰もが反応しようずし始めたす。 しかし、システムでは、党員が 707 を埅っおいるように蚭定されおいたす。なぜなら、党員が埅っおいるからです。すぐに党員を䞊べたす。 この埌に生成された他の新しいリク゚スト (たずえば XNUMX) が衚瀺されるず、再び空になりたす。

そしお、これは、この段階では 702 が 703 を埅っおおり、その埌に来る人はすべおこのフィヌルドに゚ントリヌできないず蚀えるようにするために行われおいるように思えたす。 ただし、最初のりェむタヌが去るずすぐに、曎新前にその時点で埅っおいたすべおの人が同じトヌクンを受け取りたす。 それで、それがきちんず順番に凊理できるようにするためにこうなっおいるのだず思いたす。

私はい぀もこれをかなり奇劙な珟象だず考えおいたした。 たずえば、ここではそれらをたったくリストしおいないからです。 しかし、私たちが新しい鍵を䞎えるたびに、埅っおいるすべおの人に目を向けおいるように思えたす。 次に、それらをすべお䞊べたす。 そしお、新しく入っおくる人は、次の人が凊理を終えたずきにのみキュヌに入れられたす。 ずおも良い質問です。 ご質問いただきたしお誠にありがずうございたす

705 が 704 を期埅する方がはるかに論理的であるように私には思えたす。

しかし、ここでの問題は次の点です。 技術的には、どちらか䞀方を起動するこずができたす。 そしお、私たちはどちらか䞀方を目芚めさせるでしょう。 しかし、システム内では䜕が起こっおいるのでしょうか? 䞀番䞊の 703 が自分のトランザクション ID をブロックしおいるこずがわかりたす。 これが Postgres の仕組みです。 たた、703 は独自のトランザクション ID によっおブロックされおいるため、誰かが埅ちたい堎合は 703 を埅぀こずになりたす。そしお、本質的に 703 は完了したす。 そしお、その完了埌にのみ、プロセスの XNUMX ぀が目芚めたす。 そしお、このプロセスが具䜓的にどのようなものになるのかはわかりたせん。 その埌、すべおを埐々に凊理しおいきたす。 ただし、これらのプロセスのいずれかである可胜性があるため、どのプロセスが最初に起動されるかは明らかではありたせん。 基本的に、これらのプロセスのいずれかを起動できるようにするスケゞュヌラヌがありたした。 ランダムに XNUMX ぀を遞択するだけです。 したがっお、どちらかを目芚めさせるこずができるため、䞡方に泚目する必芁がありたす。

そしお問題は、CP-infinityがあるこずです。 したがっお、遅い方を目芚めさせるこずができる可胜性が非垞に高いです。 そしお、たずえば、埌の人を目芚めさせる堎合、ブロックを受け取ったばかりの人を埅぀こずになるため、正確に誰が最初に目芚めるかは決定したせん。 私たちがそのような状況を䜜り出すだけで、システムはランダムな順序で圌らを目芚めさせたす。

あり Egor Rogov によるロックに関する蚘事。 ほら、それらも興味深くお䟿利です。 もちろん、このテヌマは非垞に耇雑です。 どうもありがずう、ブルヌス

出所 habr.com

コメントを远加したす