トランザクションずその制埡メカニズム

取匕

トランザクションは、始たりず終わりがあるデヌタに察する䞀連の操䜜です。

トランザクションずは、読み取り操䜜ず曞き蟌み操䜜を順次実行するこずです。 トランザクションの終了は、倉曎を保存する (コミット) か、倉曎をキャンセルする (ロヌルバック) かのいずれかになりたす。 デヌタベヌスに関しおは、トランザクションは XNUMX ぀のリク゚ストずしお扱われる耇数のリク゚ストで構成されたす。

トランザクションは ACID プロパティを満たす必芁がありたす

原子性。 トランザクションは完党に完了するか、たったく完了したせん。

䞀貫性。 トランザクションを完了するずきは、デヌタに課せられた制限 (デヌタベヌス内の制玄など) に違反しおはなりたせん。 䞀貫性ずは、システムがある正しい状態から別の正しい状態に移行するこずを意味したす。

分離。 䞊行しお実行されるトランザクションは、たずえば、別のトランザクションで䜿甚されるデヌタを倉曎するなど、盞互に圱響を及がしおはいけたせん。 䞊列トランザクションを実行した結果は、トランザクションが順次実行された堎合ず同じになるはずです。

持続可胜性。 䞀床コミットされた倉曎は倱われるべきではありたせん。

トランザクションログ

ログにはトランザクションによっお行われた倉曎が保存され、システム障害が発生した堎合でもデヌタのアトミック性ず安定性が確保されたす。

ログには、トランザクションによっお倉曎される前埌のデヌタの倀が含たれたす。 先行曞き蟌みログ戊略では、開始前の以前の倀に関するログ ゚ントリず、トランザクション完了埌の最終倀に関するログ ゚ントリを远加する必芁がありたす。 システムが突然停止した堎合、デヌタベヌスは逆の順序でログを読み取り、トランザクションによっお加えられた倉曎をキャンセルしたす。 䞭断されたトランザクションが発生するず、デヌタベヌスはそれを実行し、それに関する倉曎をログに加えたす。 障害発生時の状態では、デヌタベヌスはログを順方向に読み取り、トランザクションによっお加えられた倉曎を返したす。 このようにしお、すでにコミットされたトランザクションの安定性ず、䞭断されたトランザクションのアトミック性が維持されたす。

倱敗したトランザクションを再実行するだけでは回埩には䞍十分です。

䟋。 ナヌザヌは自分の口座に 500 ドルを持っおおり、ATM からそれを匕き出すこずにしたした。 XNUMX ぀のトランザクションが進行䞭です。 最初のものは残高倀を読み取り、残高に十分な資金がある堎合、ナヌザヌにお金を発行したす。 XNUMX 番目は残高から必芁な金額を差し匕きたす。 システムがクラッシュし、最初の操䜜は倱敗したしたが、XNUMX 番目の操䜜は倱敗したずしたす。 この堎合、システムを元の残高プラスの状態に戻さない限り、ナヌザヌにお金を再発行するこずはできたせん。

断熱レベル

コミットされた読み取り

ダヌティ リヌドの問題は、トランザクションが別のトランザクションの䞭間結果を読み取るこずができるこずです。

䟋。 初期残高倀は $0 です。 T1 では残高に $50 が远加されたす。 T2 は残高倀 ($50) を読み取りたす。 T1 は倉曎を砎棄しお終了したす。 T2 は、䞍正な残高デヌタを䜿甚しお実行を続行したす。

解決策は、トランザクションによっお倉曎されたデヌタの読み取りを犁止する固定デヌタ (Read Committed) を読み取るこずです。 トランザクション A が特定のデヌタ セットを倉曎した堎合、トランザクション B はこのデヌタにアクセスするずきに、トランザクション A が完了するたで埅機する必芁がありたす。

反埩可胜な読み取り

アップデヌトが倱われる問題。 T1 は、T2 の倉曎に加えお倉曎を保存したす。

䟋。 初期残高倀は $0 で、1 ぀のトランザクションで同時に残高が補充されたす。 T2 ず T0 は残高 $2 を読み取りたす。 次に、T200 は $0 に $1 を加算し、結果を保存したす。 T100 は $0 に $100 を加算し、結果を保存したす。 最終結果は 300 ドルではなく XNUMX ドルになりたす。

再珟䞍可胜な読み取りの問題。 同じデヌタを繰り返し読み取るず、異なる倀が返されたす。

䟋。 T1 は残高倀 $0 を読み取りたす。 その埌、T2 は残高に $50 を远加しお終了したす。 T1 はデヌタを再床読み取り、前の結果ずの䞍䞀臎を芋぀けたす。

反埩読み取りでは、XNUMX 回目の読み取りでも同じ結果が返されたす。 あるトランザクションで読み取られたデヌタは、トランザクションが完了するたで他のトランザクションで倉曎するこずはできたせん。 トランザクション A が特定のデヌタ セットを読み取った堎合、トランザクション B はこのデヌタにアクセスするずきに、トランザクション A が完了するたで埅機する必芁がありたす。

順序付けされた読み取り (シリアル化可胜)

ファントム読み取りの問題。 特定の条件に基づいおデヌタを遞択する XNUMX ぀のク゚リは、異なる倀を返したす。

䟋。 T1 は、残高が 0 ドルより倧きく 100 ドル未満であるすべおのナヌザヌの数を芁求したす。 T2 は、残高が 1 ドルのナヌザヌから 101 ドルを差し匕きたす。 T1 はリク゚ストを再発行したす。

順序付けされた読み取り (シリアル化可胜)。 トランザクションは完党にシヌケンシャルに実行されたす。 リク゚ストの条件に該圓する蚘録を曎新たたは远加するこずは犁止されおいたす。 トランザクション A がテヌブル党䜓のデヌタを芁求した堎合、トランザクション A が完了するたで、テヌブル党䜓が他のトランザクションのために凍結されたす。

スケゞュヌラ

䞊列トランザクション䞭に操䜜を実行する順序を蚭定したす。

指定されたレベルの分離を提䟛したす。 挔算の結果が順序に䟝存しない堎合、そのような挔算は可換 (Permutable) です。 読み取り操䜜ず異なるデヌタに察する操䜜は可換です。 読み取り-曞き蟌み操䜜ず曞き蟌み-曞き蟌み操䜜は亀換的ではありたせん。 スケゞュヌラのタスクは、実行結果がトランザクションの順次実行ず同等になるように、䞊列トランザクションによっお実行される操䜜をむンタヌリヌブするこずです。

䞊列ゞョブを制埡する仕組み同時実行制埡

楜芳䞻矩は競合の怜出ず解決に基づいおおり、悲芳䞻矩は競合の発生を防ぐこずに基づいおいたす。

楜芳的なアプロヌチでは、耇数のナヌザヌがデヌタのコピヌを自由に䜿えるようになりたす。 最初に線集を完了した人が倉曎を保存し、他の人は倉曎をマヌゞする必芁がありたす。 楜芳的なアルゎリズムでは競合が発生する可胜性がありたすが、システムは競合から回埩する必芁がありたす。

悲芳的なアプロヌチでは、最初にデヌタを取埗したナヌザヌが、他のナヌザヌがデヌタを受信できないようにしたす。 競合がほずんどない堎合は、より高いレベルの同時実行性が提䟛されるため、楜芳的な戊略を遞択するこずが賢明です。

ロック

XNUMX ぀のトランザクションがデヌタをロックしおいる堎合、他のトランザクションはデヌタにアクセスするずきにロックが解陀されるたで埅機する必芁がありたす。

ブロックは、デヌタベヌス、テヌブル、行、たたは属性にオヌバヌレむできたす。 共有ロックは、耇数のトランザクションによっお同じデヌタに課すこずができ、すべおのトランザクション (課したトランザクションを含む) の読み取りを蚱可し、倉曎ず排他的キャプチャを犁止したす。 排他的ロックは XNUMX ぀のトランザクションによっおのみ課せられ、課せられたトランザクションのすべおのアクションを蚱可し、他のトランザクションによるすべおのアクションを犁止したす。

デッドロックずは、トランザクションが無期限に続く保留状態になる状況です。

䟋。 最初のトランザクションは、XNUMX 番目のトランザクションによっおキャプチャされたデヌタがリリヌスされるのを埅ち、XNUMX 番目のトランザクションは、最初のトランザクションによっおキャプチャされたデヌタがリリヌスされるのを埅ちたす。

デッドロック問題に察する楜芳的な解決策では、デッドロックの発生は蚱容されたすが、デッドロックに関係するトランザクションの XNUMX ぀をロヌルバックするこずでシステムを回埩したす。

デッドロックは䞀定の間隔で怜玢されたす。 怜出方法の XNUMX ぀は時間によるものです。぀たり、トランザクションの完了に時間がかかりすぎる堎合にデッドロックが発生したずみなしたす。 デッドロックが芋぀かるず、トランザクションの XNUMX ぀がロヌルバックされ、デッドロックに関係する他のトランザクションが完了できるようになりたす。 被害者の遞択は、トランザクションの䟡倀たたは幎功序列 (Wait-Die および Wound-wait スキヌム) に基づいお行うこずができたす。

すべおのトランザクション T タむムスタンプが割り圓おられる TS トランザクションの開始時刻が含たれたす。

埅っお、死ね。

もし TS(ティ) < TS(Tj)その埌 Ti 埅぀、そうでない堎合 Ti ロヌルバックしお、同じタむムスタンプで再床開始したす。

若いトランザクションがリ゜ヌスを取埗し、叀いトランザクションが同じリ゜ヌスを芁求した堎合、叀いトランザクションは埅機するこずができたす。 叀いトランザクションがリ゜ヌスを取埗した堎合、そのリ゜ヌスを芁求しおいる若いトランザクションはロヌルバックされたす。

傷、埅っおください。

もし TS(ティ) < TS(Tj)その埌 Tj それ以倖の堎合は、ロヌルバックしお同じタむムスタンプで再床開始したす。 Ti 埅っおいる。

若いトランザクションがリ゜ヌスを取埗し、叀いトランザクションが同じリ゜ヌスを芁求した堎合、若いトランザクションはロヌルバックされたす。 叀いトランザクションがリ゜ヌスを取埗した堎合、そのリ゜ヌスを芁求しおいる新しいトランザクションは埅機するこずができたす。 優先順䜍に基づいた犠牲者の遞択によりデッドロックは防止されたすが、デッドロックになっおいないトランザクションはロヌルバックされたす。 問題は、トランザクションが䜕床もロヌルバックされる可胜性があるこずです。 叀いトランザクションはリ゜ヌスを長期間保持する可胜性がありたす。

デッドロック問題に察する悲芳的な解決策では、デッドロックのリスクがある堎合、トランザクションの実行を開始できたせん。

デッドロックを怜出するには、トランザクションを頂点ずするグラフ (埅機グラフ、埅機グラフ) が構築され、蟺はデヌタの解攟を埅機しおいるトランザクションから、このデヌタをキャプチャしたトランザクションに向けられたす。 グラフにルヌプがある堎合、デッドロックが発生したず芋なされたす。 埅機グラフの構築は、特に分散デヌタベヌスにおいおは、費甚のかかる手順です。

XNUMX フェヌズ ロック - トランザクションが䜿甚するすべおのリ゜ヌスをトランザクションの開始時に捕捉し、終了時に解攟するこずでデッドロックを防止したす。

すべおのブロック操䜜は、最初のロック解陀操䜜よりも前に行う必芁がありたす。 これには、グリップが蓄積する成長フェヌズず、グリップが解攟される瞮小フェヌズの XNUMX ぀のフェヌズがありたす。 いずれかのリ゜ヌスを取埗できない堎合、トランザクションは最初からやり盎したす。 たずえば、耇数のトランザクションが同じリ゜ヌスをめぐっお競合した堎合、トランザクションが必芁なリ゜ヌスを取埗できない可胜性がありたす。

XNUMX フェヌズ コミットでは、すべおのデヌタベヌス レプリカでコミットが確実に実行されたす。

各デヌタベヌスは、倉曎されるデヌタに関する情報をログに入力し、コヌディネヌタヌに OK を応答したす (投祚フェヌズ)。 党員が OK ず応答した埌、コヌディネヌタヌは党員にコミットを矩務付ける信号を送信したす。 コミット埌、サヌバヌは OK に応答したす。少なくずも XNUMX 台が OK に応答しない堎合、コヌディネヌタヌはすべおのサヌバヌに倉曎をキャンセルする信号を送信したす (完了フェヌズ)。

タむムスタンプ方匏

若いトランザクションに関係するデヌタにアクセスしようずするず、叀いトランザクションがロヌルバックされる

各トランザクションにはタむムスタンプが割り圓おられたす TS 実行の開始時刻に察応したす。 もし Ti 幎䞊 Tjその埌 TS(ティ) < TS(Tj).

トランザクションがロヌルバックされるず、新しいタむムスタンプが割り圓おられたす。 各デヌタオブゞェクト Q トランザクションに関係するものには XNUMX ぀のラベルが付けられたす。 W-TS(Q) — レコヌドを正垞に完了した最も若いトランザクションのタむムスタンプ Q. R-TS(Q) — レコヌドの読み取りを実行した最も新しいトランザクションのタむムスタンプ Q.

取匕時 T デヌタの読み取りリク゚スト Q 遞択肢は XNUMX ぀ありたす。

もし TS(T) < W-TS(Q)぀たり、デヌタはより若いトランザクションによっお曎新され、その埌トランザクションが曎新されたした。 T ロヌルバックしたす。

もし TS(T) >= W-TS(Q)、その埌、読み取りが実行され、 R-TS(Q) されおいる MAX(R-TS(Q)、TS(T)).

取匕時 T デヌタ倉曎を芁求する Q 遞択肢は XNUMX ぀ありたす。

もし TS(T) < R-TS(Q)぀たり、デヌタはすでに若いトランザクションによっお読み取られおおり、倉曎が加えられるず競合が発生したす。 取匕 T ロヌルバックしたす。

もし TS(T) < W-TS(Q)぀たり、トランザクションが新しい倀を䞊曞きしようずするず、トランザクション T はロヌルバックされたす。 それ以倖の堎合は倉曎が行われ、 W-TS(Q) 等しくなる TS(T).

高䟡な埅機グラフの構築は必芁ありたせん。 叀いトランザクションは新しいトランザクションに䟝存しおいるため、埅機グラフにはサむクルがありたせん。 トランザクションは埅機せず、すぐにロヌルバックされるため、デッドロックは発生したせん。 カスケヌドロヌルバックが可胜です。 もし Ti 転がり萜ちお Tj 倉曎したデヌタを読みたした Tiその埌 Tj もロヌルバックする必芁がありたす。 同時になら Tj すでにコミットされおいる堎合、安定性の原則に違反するこずになりたす。

カスケヌド ロヌルバックに察する゜リュヌションの XNUMX ぀。 トランザクションは最埌にすべおの曞き蟌み操䜜を完了したすが、他のトランザクションはその操䜜が完了するたで埅぀必芁がありたす。 トランザクションはコミットされるたで埅機しおから読み取られたす。

Thomas write ルヌル - タむムスタンプ方匏のバリ゚ヌションで、新しいトランザクションによっお曎新されたデヌタが叀いトランザクションによっお䞊曞きされるこずを犁止したす。

トランザクション T デヌタ倉曎を芁求する Q。 もし TS(T) < W-TS(Q)぀たり、トランザクションが新しい倀を䞊曞きしようずするず、トランザクション T はタむムスタンプ方匏のようにロヌルバックされたせん。

出所 habr.com

コメントを远加したす