WALプロトコル 処理順について

satさん  
(No.1)
平成24年春期 午前Ⅱ 問17
平成21年春期 午前Ⅱ 問11
の解答の一部で

4.ログに更新後レコードを書き出す。

2.データベースの更新

となる理由が分かりません。
どなたかお力添え願えませんか。

解説中には
「データベースの更新は、まずそれをログを書き出してから行う(更新前ログ)」
「トランザクションはコミットを行う前に、該当する全てのデータベース更新情報をログを書き出す(更新後ログ)」
「Commit直前に更新後Logを記録~」
等という記述があります。

「2.データベースの更新」は更新処理(UPDATE等)を発行してCommit前までの処理と考えてしまったのですが、
「2.データベースの更新」 =「Commit指示->データファイル実体の更新」
と考えればいいのですか?
それともUPDATE等の発行前に更新後ログが記録されるのでしょうか。

この辺りの理解できる解説が見当たらず書き込ませていただきました。
2018.03.14 17:08
すんすんさん 
(No.2)
WriteAheadLog(ログ先書き)というくらいですからデータベースの更新前に、ログに書き込まなければなりません。
ここの解説に記載があります。(リンクが貼れないのでタイトルのみですいません)
@IT 「データベーススペシャリスト試験」戦略的学習のススメ(25)

ちなみにcommit=更新後情報の実ファイルへの書き出しではありません。
commitはデータベースが「この処理が完了したことを保障する。」もので、実ファイルへの書き出しはまた別のタイミングで非同期(チェックポイント)で行われます。
つまりcommit後は、メモリ上のみに更新データが存在する状態で、ディスクとメモリでデータに違いが発生しています。(データがダーティな状態となる。)
そのタイミングで障害が発生した場合(電源が落ちた等)、実ファイルは更新前情報のみが残っており、メモリ上にあった更新後情報は消失してしまいます。
そこから更新後情報をログから取り出しロールフォワードすることにより、データベースのACID特性のひとつである耐久性が保障されます。
(この辺も上のサイトに書いてあると思います。自分は書籍「即戦力のDB2管理術」という本で学びました。)
2018.03.22 16:07

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。

その他のスレッド


Pagetop