H21 AM2 問11 解説

かよさん  
(No.1)
解説文に
> 正常なトランザクションは BEGIN TRANSACTION によって開始され、COMMIT を経て END TRANSACTION で終了しますが、WALプロトコルに従えばトランザクションの開始直後に更新前ログを書出し、COMMIT直前に更新後ログを書き出すことになります。
とありますが、この解説に従うと132456の順になるのではないでしょうか? それとも、「COMMIT」に実データの更新も含まれているのでしょうか?
2021.02.20 15:03
GinSanaさん 
DB シルバーマイスター
(No.2)
1⇒3⇒2⇒4⇒5⇒6だと、2で障害が発生した場合に、4でやるはずの更新後の内容が記録されていないので戻せないことになります。それだと更新後の内容がメモリにあるので、たとえば電源が落ちたらメモリから消えちゃいますね。
ロールフォワードするのに、先に書いとけば、ACID特性の耐久性が保障されることになりますね。

>それとも、「COMMIT」に実データの更新も含まれているのでしょうか?
https://www.db-siken.com/bbs/0051.html
より
・・・・・・・・・
ちなみにcommit=更新後情報の実ファイルへの書き出しではありません。
commitはデータベースが「この処理が完了したことを保障する。」もので、実ファイルへの書き出しはまた別のタイミングで非同期(チェックポイント)で行われます。
つまりcommit後は、メモリ上のみに更新データが存在する状態で、ディスクとメモリでデータに違いが発生しています。(データがダーティな状態となる。)
・・・・・・・・・

2021.02.20 21:51
かよさん  
(No.3)
耐久性を保証するのに134256である必要があるのは分かりましたが、解説にあるCOMMITとは一体何なのですか?5(COMMITレコードを書き出す)とは別物なのでしょうか?
2021.02.21 18:57
GinSanaさん 
DB シルバーマイスター
(No.4)
>解説にあるCOMMITとは一体何なのですか?5(COMMITレコードを書き出す)とは別物なのでしょうか?

COMMITレコードを書き出す(問題文)のと一緒です。普段、コミットとかロールバックで、いちいちコミットレコードを書き出して・・・って言わないような感覚です。

2021.02.21 22:31
かよさん  
(No.5)
その場合、「COMMIT直前に更新後ログを書き出すことになります。」という解説が間違っていることになりませんか?
正解の134256の順だと、COMMIT直前にやることは「更新後データのバッファへの書き出し」ですよね。
2021.02.22 11:32
GinSanaさん 
DB シルバーマイスター
(No.6)
>その場合、「COMMIT直前に更新後ログを書き出すことになります。」という解説が間違っていることになりませんか?

まあ、たしかに更新後ログの書き出しは(問題文的には)「更新後データのバッファへの書き出し」の直前なんですが、
「更新後データのバッファへの書き出し」って、この順以外でも、チェックポイントが発生したり、バッファのフラッシュが発生すると実行されるから、タイミングを書くのに、もう少しわかりやすい「COMMIT」の直前って書いたんじゃあないでしょうかね。
2021.02.22 13:44
かよさん  
(No.7)
ようやくわかりました。
ありがとうございました。
2021.02.22 14:23

返信投稿用フォーム

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

その他のスレッド


Pagetop