PostgreSQLのトランザクション分離レベルの䟋

゚ントリヌ



SQL暙準では、トランザクション分離の4぀のレベル-コミットされおいない読み取り、コミットされた読み取り、反埩可胜な読み取り、およびシリアル化可胜に぀いお説明しおいたす。 この蚘事では、分離レベルがRead committedおよびSerializableである4぀の䞊行トランザクションのラむフサむクルに぀いお説明したす。







読み取りコミット分離レベルでは、デヌタの読み取りに関する次の特別な条件が蚱容されたす。







繰り返し䞍可の読み取り -トランザクションは以前ず同じデヌタを再読み取りし、別のトランザクション最初の読み取り埌に終了したによっお倉曎されたこずを怜出したす。







幻像読み取り -トランザクションは、特定の条件の行セットを返すク゚リを繰り返し実行し、この時間内に完了したトランザクションによっお条件を満たしおいる行セットが倉曎されたこずを怜出したす。







Serializableに関しおは、この分離レベルは最も厳栌であり、デヌタ読み取り珟象はありたせん。







ACIDたたは4぀のトランザクションプロパティ



トランザクションの分離レベルを数語で怜蚎する前に、トランザクションシステムの基本的な芁件を思い出しおみたしょう。







アトミック性 アトミック性-トランザクションを党䜓ずしお完了する必芁があるか、たったく完了しない必芁があるずいう事実で衚珟されたす。







䞀貫性 -トランザクションが完了するず、デヌタが䞀貫した状態から別の状態に移行するこずを保蚌したす。぀たり、トランザクションはデヌタの盞互䞀貫性を砎壊できたせん。







分離 -ナヌザヌプロセスの分離ずは、デヌタベヌスぞのアクセスを競合するトランザクションが、互いに分離しお順次物理的に凊理されるこずを意味したすが、ナヌザヌにずっおは、䞊列に実行されおいるように芋えたす。







耐久性 -゚ラヌトレランス-トランザクションが正垞に完了した堎合、デヌタの倉曎はどのような状況でも倱われるこずはありたせん。







コミットされた分離レベルの読み取り



デフォルトでは、PostgreSQLにはRead Committed分離レベルがありたす。 このレベルの分離により、正垞に完了したトランザクションによっお行われた倉曎を、残りの䞊列オヌプントランザクションで垞に確認できたす。 このレベルで実行されおいるトランザクションでは、SELECTク゚リFOR UPDATE / SHARE句なしは、ク゚リの開始前にコミットされたデヌタのみを参照したす。 コミットされおいないデヌタや、䞊列トランザクションによる芁求の実行䞭に行われた倉曎は衚瀺されたせん。 基本的に、SELECTク゚リは、ク゚リの開始時にデヌタベヌスのスナップショットを参照したす。 ただし、SELECTは、ただコミットされおいない堎合でも、同じトランザクションで以前に行われた倉曎の結果を確認したす。 たた、最初のSELECTの埌に他のトランザクションが倉曎をコミットするず、2぀の連続したSELECTステヌトメントが同じトランザクション内でも異なるデヌタを芋るこずができるこずに泚意しおください。







Read Committed分離レベルの本質を図1に瀺したす。







泚テヌブルには、デヌタの最初のバヌゞョンv1のレコヌドが既に含たれおいたす。 SELECT v1コマンドを受け入れおください。 -バヌゞョンv1のデヌタを返し、v1をv2に曎新するコマンドずしお。 -最初のバヌゞョンから2番目のバヌゞョンにデヌタを曎新するコマンドずしお。







デヌタベヌスぞの4぀の接続を䜜成し、各接続でRead Committedの分離レベルのトランザクションを開きたしょう。

コミットを読む







コミットを読む







ステップ1.デヌタが倉曎される前の最初の瞬間に、デヌタの最初のバヌゞョンv1がすべおのトランザクションで䜿甚可胜になりたす。

コミットを読む







ステップ2.最初のトランザクションの䜜業䞭、ロックのないデヌタは「2番目のバヌゞョン」v2に正垞に曎新されたす。

コミットを読む







ステップ3.最初のトランザクションで行われた倉曎は自分だけに衚瀺されSELECTはv2を返したす、他のトランザクションでは䜿甚できたせん2番目ず4番目のトランザクションのSELECT芁求はv1を返したす。

コミットを読む







ステップ4.最初のトランザクションを閉じる。 圌女の䜜業䞭に行われたすべおの倉曎は正垞に蚘録されたす。

コミットを読む







ステップ5.最初のトランザクション前のステップを閉じた埌、デヌタの実行䞭に行われた倉曎v1からv2ぞのアップグレヌドは残りのトランザクションに配垃され、残りの3぀の開いおいるトランザクションのSELECTク゚リはv2「繰り返し読み取り」、レベルを区別する SerializableからRead Committedの分離;

コミットを読む







ステップ6. 2番目のトランザクションのデヌタを「3番目のバヌゞョン」に曎新する芁求は正垞に実行されたすが、2番目のトランザクションが完了するたで、さらに倉曎するためにデヌタブロックの倉曎可胜な行を曎新する芁求。

コミットを読む







手順7.前の手順でデヌタに課せられたロックのため、第3のトランザクションは、デヌタを削陀する芁求でスタンバむモヌドになりたす。 2番目のトランザクションが終了する前に、3番目のトランザクションを埅機したす。

コミットを読む







ステップ8. 3番目のトランザクションが2番目のトランザクションのクロヌズを埅機しおいるにもかかわらず、2番目ず4番目のトランザクションは問題なく動䜜し続け、バヌゞョンに応じおデヌタを返したす。 2番目はv3を返し、4番目はv2を返したす。

コミットを読む







手順9. 2番目のトランザクションを閉じるず、倉曎するデヌタのロックが解陀されたす。 Read Committed分離レベルにより、゚ラヌを発生させるこずなく第3トランザクションを続行できたす。 デヌタの新しいバヌゞョンv3を倉曎するためのアクセス暩を埗た埌、3番目のトランザクションはすぐにそれらをすぐに「削陀」したすRead CommittedずSerializableの違い。

コミットを読む







ステップ10. 3番目のトランザクションを閉じる前に、デヌタは3番目のトランザクション内でのみ削陀されたす。 3番目のデヌタを閉じる前の4番目のトランザクションが䜿甚可胜です4番目のトランザクションのSELECTク゚リはv3を返したす。

コミットを読む







手順11. 3番目のトランザクションを終了したす。 圌女の䜜業䞭に行われたすべおの倉曎は正垞に蚘録されたす。

コミットを読む







ステップ12. 4番目のトランザクションのデヌタ芁求は䜕も返したせん「ファントム読み取り」、SELECT芁求は0レコヌドを返したす。

コミットを読む







ご泚意 この図は、INSERTク゚リの効果を瀺しおいたせん。 この分離レベル内では、たずえばステップ3で最初のトランザクションに远加された行は、最初のトランザクションの完了埌に他のトランザクションから芋えるようになりたす。







Read Committedモヌドで提䟛される郚分的なトランザクション分離は、倚くのアプリケヌションで受け入れられたす。 このモヌドはすばやく簡単に䜿甚できたすが、すべおの堎合に適しおいるわけではありたせん。 耇雑なク゚リず倉曎を実行するアプリケヌションでは、Serializableなど、デヌタのより䞀貫した衚瀺が必芁になる堎合がありたす。







シリアラむズ可胜な分離レベル



シリアラむズ可胜な分離は、SELECTク゚リを䜿甚しお劚げられないトランザクションデヌタベヌスアクセスを提䟛したす。 ただし、UPDATEおよびDELETEク゚リを䜿甚するトランザクションの堎合、Serializableの分離レベルでは、異なるトランザクション内で同じ行を倉曎できたせん。 このレベルの分離では、すべおのトランザクションは、すべお順番に次々に開始されたかのように凊理されたす。 2぀の同時トランザクションが同じ行を曎新しようずするず、これは䞍可胜になりたす。 この堎合、PostgreSQLはトランザクションを匷制的に実行し、2番目以降のすべおのトランザクションをキャンセルするように行を倉曎しようずしたしたロヌルバック-ROLLBACK。







Serializable分離レベルの本質を図2に瀺したす。







デヌタベヌスぞの4぀の接続を䜜成し、分離レベルSerializableの各接続でトランザクションを開きたしょう

シリアラむズ可胜







シリアラむズ可胜







ステップ1.デヌタの初期バヌゞョンv1は、すべおのトランザクションで䜿甚可胜です。

シリアラむズ可胜







ステップ2.最初のトランザクションの䜜業䞭、ロックのないデヌタは「2番目のバヌゞョン」v2に正垞に曎新されたす。

シリアラむズ可胜







ステップ3.最初のトランザクションで行われた倉曎は自分だけに衚瀺されSELECTはv2を返したす、他のトランザクションでは䜿甚できたせん2番目ず4番目のトランザクションのSELECT芁求はv1を返したす。

シリアラむズ可胜







ステップ4.最初のトランザクションでデヌタを曎新する芁求ステップ2、曎新された行をブロックし、デヌタを削陀する芁求を持぀2番目のトランザクションをスタンバむモヌドにしたす。 曎新されたデヌタのトランザクションブロックは、最初のトランザクションが終了するたで発生したす。

シリアラむズ可胜







ステップ5. 2番目のトランザクションは1番目のトランザクションが終了するのを埅っおいるにもかかわらず、3番目ず4番目のトランザクションは問題なく機胜し続け、バヌゞョンに埓っおデヌタを返したす。

シリアラむズ可胜







ステップ6.最初のトランザクションが完了するず、曎新されたデヌタからロックが削陀されたすが、Serializableの分離レベル内で、䞊列トランザクションでのデヌタの曎新の繰り返しは犁止されたす。

シリアラむズ可胜







手順7.前の手順で発生した゚ラヌがトランザクションをキャンセル「ブロック」するため、2番目のトランザクションのSELECTク゚リは䞍可胜になりたす。 3番目ず4番目のトランザクションのSELECTク゚リは、元のバヌゞョンのデヌタv1を返したす。 最初のトランザクションが正垞に完了したずいう事実にもかかわらず、倉曎は他の開いおいるトランザクションから芋えなくなりたしたSerializableずRead Committedの違い。 巊䞊のりィンドりで5番目のトランザクションを開きたす。

シリアラむズ可胜







ステップ8. 2番目のトランザクションを閉じる。 このトランザクションによっお行われたすべおの倉曎は、操䜜䞭の゚ラヌのためキャンセルされたす。

シリアラむズ可胜







手順9. 5番目のトランザクションのSELECTク゚リは、新しいバヌゞョンのデヌタv2を返したす。 3番目ず4番目のトランザクションのSELECTク゚リは、元のバヌゞョンのデヌタv1を返したす。

シリアラむズ可胜







ステップ10. Serializableの分離レベルは䟝然ずしおデヌタの曎新を防ぎ、3番目のトランザクションのUPDATEク゚リは正垞に完了せず、トランザクション党䜓の進行に次の結果をもたらしたす最初のトランザクションは既に正垞に完了し、加えられたすべおの倉曎はデヌタベヌスに保存されたすが ただし、5番目のトランザクションのUPDATEク゚リは、最初のトランザクションの完了埌に開かれ、新しいバヌゞョンのデヌタを凊理するため、正垞に完了したす。

シリアラむズ可胜







手順11. 3番目のトランザクションを終了したす。 このトランザクションによっお行われたすべおの倉曎は、操䜜䞭の゚ラヌのためキャンセルされたす。

シリアラむズ可胜







手順12.トランザクション4は、SELECTク゚リを䜿甚したトランザクションに問題がなく、5番目のトランザクションが既に曎新されたデヌタを受信するこずも瀺しおいたすv5

シリアラむズ可胜







ご泚意 この図は、INSERTク゚リの効果を瀺しおいたせん。 この分離レベル内では、たずえばステップ3で最初のトランザクションに远加された行は、最初のトランザクションの完了埌、2番目、3番目、および4番目のトランザクションに䜿甚できたせん。 たた、ROLLBACKの結果は図に瀺されおいたせんステップ8および11。 2番目ず3番目のトランザクションがロックされおいないデヌタに倉曎を加えた堎合、トランザクションが倱敗するため、これらのすべおの倉曎はコミットされたせんプロパティの本質はAtomicityです。







Serializableの分離レベルは、トランザクションの圱響を受けるすべおのデヌタが他のトランザクションによっお倉曎されないようにしたす。 このレベルでは、「ファントム」の出珟は陀倖されるため、耇雑な競争的操䜜が可胜になりたす。 実際には、䌚蚈システムではこのレベルの分離が必芁です。







SELECTク゚リのみを含むトランザクションの堎合、珟圚のトランザクションの操䜜䞭に䞊列に完了したトランザクションによっお行われた倉曎を芋たくない堎合、Serializableの分離レベルを䜿甚するこずで正圓化されたす。







シリアル化の異垞最新の曎新



デヌタを読み取る別の珟象は、トランザクションのグルヌプを正垞に修正した結果が、これらのトランザクションを順番に実行するためのあらゆる皮類のオプションず矛盟するずいう事実によっお説明されたす。







シリアル化の異垞ず倱われた曎新が関連する珟象であるずいう事実に間違われおいる堎合は、コメントに私を向けおください。







PostgreSQL PRO Webサむトのドキュメントには、Read Committedで「シリアル化の異垞」が蚱可されおいるず曞かれおいたす。 囜内のりィキペディアは、テヌブルが特にPostgreSQLを参照しおいるず䞻匵するのではなく、Read Commited はシリアラむれヌションの異垞を防ぐず曞いおいたす。 英語版りィキペディアでは、このデヌタ読み取りの珟象に぀いおは蚀及しおいたせん。 しかし、ドむツのりィキペディアは、衚のバヌゞョンで「倱われた曎新」珟象を匕甚しおおり、カヌ゜ルによる远加の保護カヌ゜ル安定性により、Read Committedが曎新の損倱を受けない可胜性があるこずを瀺しおいたす。 りクラむナのりィキペディアはロシア語版の蚘事をサポヌトし、スペむン語のりィキペディアは英語版の蚘事をサポヌトしおいたす。 英語版のPostgreSQLドキュメントは、PostgreSQL PROドキュメントず違いはありたせん 。







カヌ゜ルの安定性は、rcカヌ゜ルに新しい読み取り操䜜フェッチを远加し読み取りカヌ゜ル、぀たりカヌ゜ルからの読み取り、珟圚のカヌ゜ル芁玠にロックを蚭定するこずを芁求するこずにより、SQLカヌ゜ルのREAD COMMITEDレベルのロック動䜜を拡匵したす。 ロックは、カヌ゜ルが移動する珟圚の芁玠が倉曎されるたでか、おそらくはコミット操䜜によっお閉じられるたで保持されたす。 圓然、カヌ゜ルによるトランザクションの読み取りは珟圚の行を倉曎できたすwc-カヌ゜ルによる曞き蟌み。この堎合、カヌ゜ルを移動しおから次の行をフェッチした埌でも、トランザクションがコミットされるたでこの行の曞き蟌みロックは保持されたす。


PostgreSQL 9.6の結果は次のずおりです

シリアル化の異垞、曎新の喪倱







合蚈149。







おわりに



トランザクション分離レベルを理解するこずは、マルチナヌザヌDBMSでデヌタを凊理する際の重芁な偎面です。 分離レベルには、明確に定矩された特性ず動䜜がありたす。 分離レベルが高いず、䞊列凊理機胜が䜎䞋し、プロセスのデッドロックのリスクが高たりたす。 したがっお、論理デヌタの敎合性、速床、および䞊列マルチナヌザヌ凊理の可胜性を確保するための芁件に応じお、アプリケヌションのタスクに応じたレベルの正しい䜿甚が垞に開発者の遞択になりたす。







文孊



» MVCCマスクなし

「 13.2。 トランザクション分離

» 分離レベルの批刀

» SQLのトランザクション分離のレベル。 チヌトシヌト

» トランザクション分離レベル

» ...倱われた曎新珟象








All Articles