ツーフェーズロックのソースを表示
←
ツーフェーズロック
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''ツーフェーズロック''' ('''Two-Phase Locking''') あるいは'''2相ロッキング'''とは、[[並列コンピューティング|並列処理]]システム(特に[[データベース管理システム]] (DBMS) や[[関係データベース]])で使用される[[ロック (情報工学)|ロック]]手法である。ツーフェーズロックは以下のように分類される。 * '''Strict 2PL''': 厳密な (Strict) ツーフェーズロック * '''2PL''': 厳密でない (Non-Strict) ツーフェーズロック * '''C2PL''': 保守的な (Conservative) ツーフェーズロック 単にツーフェーズロック (2PL) といった場合、厳密でない (Non-strict) ツーフェーズロックを指す。以下ではこれらについて解説する。 == 厳密な (Strict) ツーフェーズロック == Strict 2PL には以下の2つの原則がある。 # トランザクションTがあるオブジェクトをリード/ライトしようとしたとき、そのオブジェクトに共有/排他[[ロック (情報工学)|ロック]]を使用しなければならない。 # トランザクションTがかけた全ての排他ロックはTがコミットする際に解放される(コミット前ではない)。 以下に2つの相互に影響する処理での Strict 2PL の例を示す。 :<math>D = \begin{bmatrix} T1 & T2 \\ S(A) & \\ R(A) & \\ & S(A) \\ & R(A) \\ & X(B)\\ & R(B) \\ & W(B)\\ & Commit \\ X(C) & \\ R(C) & \\ W(C) & \\ Commit &\end{bmatrix}</math> テキストで表すと、次のようになる。 T1: S(A), R(A); T2: S(A), R(A), X(B), R(B), W(B), Commit; T1: X(C), R(C), W(C), Commit ここで *S(O) は、オブジェクトO への共有(Shared)ロック操作 *X(O) は、オブジェクトO への排他(eXclusive)ロック操作 *R(O) は、オブジェクトO へのリード(Read)操作 *W(O) は、オブジェクトO へのライト(Write)操作 Strict 2PL は、コミットされていないデータをリードすること、コミットされていないデータを更新すること、リードとライトの衝突などを防ぐ。従ってカスケーディングロールバック(トランザクションの中断によって発生するロールバックが複数のトランザクションを巻き込んでしまう現象)も防ぐことができる。というのもライト操作を防ぐ排他ロックをトランザクションをコミットするまでかけているからである。 === Strict 2PL はデッドロックを防げない === リアルタイムシステムでは[[デッドロック]]を防ぐことは重要である。また、[[分散データベース]]や多重化された[[フォールトトレラントシステム]]では困難だろう。 Strict 2PL ではデッドロックが以下のような流れで発生する。 :<math>G = \begin{bmatrix} T1 & T2\\ X(A) & \\ & X(B) & \\ X(B) & \\ & X(A) \end{bmatrix}</math> テキストでは以下のようになる T1: X(A) T2:X(B) T1:X(B) T2: X(A) T1 は T2 が B にかけたロックが外されるのを待ち、T2 は T1 が A にかけたロックが外されるのを待つ。2つのトランザクションはその先に進むことができず、両者共にデッドロック状態になる。 [[デッドロック]]問題には汎用の解決策は存在しない。従って、状況に応じて予防/対処するしかない。状況によっては、「[[銀行家のアルゴリズム]]」や「ロック獲得順の設定」のような対策によってデッドロックを防ぐこともできる。 厳密なツーフェーズロックよりもさらに厳密な '''厳格な(Rigorous)ツーフェーズロック'''もある。これはトランザクションのコミットの際に共有ロックを含めた全ロックを解放するものである。多くのデータベースは Strict 2PL を使用している。 == 厳密でないツーフェーズロック (2PL) == 2PLの原則は Strict 2PL のものに似ていて、以下のようになる。 # トランザクションTがあるオブジェクトをリード/ライトしようとしたとき、そのオブジェクトに共有/排他[[ロック (情報工学)|ロック]]を使用しなければならない。 # トランザクションはいずれかのロックを解放したら追加のロックをかけることができない。また、いつでもロックを解放することができる(Strict 2PL ではコミット時のみ)。 従って、トランザクションには成長期(ロック獲得期)と減退期(ロック解放期)がある。2PLは衝突直列化可能なスケジュールのみを許す。 == 保守的なツーフェーズロック (C2PL) == 保守的な2PL (C2PL) は[[デッドロック]]を防ぐ。 2PLとC2PLの違いは、C2PLがトランザクション開始前に必要な全ロックを獲得するという点にある。これによりトランザクションの途中でロックを獲得しようとしてデッドロックとなることがなくなる。 ロックの衝突が激しい状況では、C2PLでのトランザクションは途中でブロックされないので、2PL や Strict 2PL に比較して平均ロック獲得期間を減らすことができる。 ロックの衝突が少ない状況では、C2PLは必要以上にロックを獲得するため、オーバヘッドが高くなる。 また、トランザクションは必要とされるロックが全て獲得できるまでいかなるロックも獲得しないし、処理も開始できない。さらに、トランザクション毎にリード/ライトするデータを全て宣言する必要があり、これは必ずしも常に可能とは言えない。このような制限があるため、C2PL はあまり使われていない。 {{Computer-stub}} {{DEFAULTSORT:つうふえすろつく}} [[Category:データベース]] [[Category:排他制御]] [[Category:トランザクション処理]] [[de:Sperrverfahren#Zwei-Phasen-Sperrprotokoll]]
このページで使用されているテンプレート:
テンプレート:Computer-stub
(
ソースを閲覧
)
ツーフェーズロック
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報