厳密な解説よりも「わかればいいや」とか「わかりやすい」を基準に解説していきます。
1520 views
答えはウの3回。
まずは、トランザクションとチェックポイントの整理します。
プログラムからDBに書き込む前に、排他制御を行うためにトランザクションを開始し、処理が完了すると、コミットを発行してトランザクションを終了します。
コミットを行うと、データベースに反映されることになります。
しかし、データベースにはログファイルとデータファイルがあります。
WAL方式は、Write Ahead Logの略で、まずログを最初に書け、という意味です。
WAL方式のの場合、コミットはログファイルに書き込んだだけの状態です。
一方、チェックポイントは、データファイルを更新した状態を指します。
単純に、コミットした時点でログもデータファイルも更新すればよいように思いますが、ログファイルに書き込む処理に比べて、データファイルの更新処理は時間がかかります。
そのため、ログファイルにだけ先に書いておき、後でゆっくりデータファイルに反映を行うようになっています。
問題は、チェックポイントの発生頻度は1時間当たり何回か?という問題です。
チェックポイントが発生する条件は、問題に以下のように書かれています。
1.のデータベースのバッファ領域に空きがなくなった場合ですが、コミットしない場合は、データはログファイルに書かれず、データベースのキャッシュにだけデータ残ります。キャッシュとはデータベースが占有しているメモリです。
SQLを実行すると、まずキャッシュにだけデータが入ります。
そしてトランザクションが終了する、つまり、コミットするとログファイルに書き込まれ、キャッシュは消えます。
問題では、キャッシュは480Mバイトあり、1トランザクションあたり、10Kバイトしか書き込まないため、キャッシュが満杯になってチェックポイントが発生する、ということはなさそうです。
となると、2.の発生条件だけが問題になり、ログファイルが1時間で何回満杯になるかだけを考えればよくなります。
1秒間に20回のトランザクションが発生し、1回のトランザクションで10Kバイト書き込むため、
1秒間に書き込むバイト数は
10,000(バイト)×20(回) = 200,000バイト
になります。
1秒間に200,000バイト書き込むので、1時間だと3600倍のログを書き込むことになります。
200,000(バイト)×3600(回) =720,000,000(バイト)
1時間に720,000,000バイト書き込みますが、ログは1面240Mバイトで2面書き込むため、240Mバイト書き込むたびにログが切り替わります。
720,000,000バイトログに書き込むと、何回ログが切り替わるかは、ログサイズで割ればわかります。
720,000,000(バイト)/240,000,000(バイト) = 3(回)
よって、答えは3回のウになります。
Page 3 of 14.
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/