- PR -

データファイルに書き込まれた未コミットデータに対する記録のロールバックのタイミングについて

1
投稿者投稿内容
雪洲
会議室デビュー日: 2005/12/03
投稿数: 2
投稿日時: 2005-12-03 20:38
Oracle 9i Silver DBA I を受験しようと勉強中です。学術的な質問で恐縮ですが、どなたか解る方、お助けください。

[質問]
[凡例]をご覧いただいた上で下記質問事項を読んでください。

(1)コミットが発行されたのは、update-A文に対応する変更についてだけなのに、REDOログファイル(D部分)や、データファイルへの書込み(E部分)はupdate-A,B,C全ての変更について発生するというのが私の理解です。この理解で正しいでしょうか?

(2)私の理解が正しいとした場合、Eでデータファイルに書き込まれたデータベースバッファキャッシュの内、未コミットに対応するupdate-B,Cの内容はロールバックされなければならないと思うのですが、いつロールバックされるのでしょうか?なお、データベースは正常に今後も動作し続け、インスタンス障害等によるインスタンスリカバリは発生しないものとします。

[凡例]
あるユーザーが3つのUPDATE文(update-A,update-B,update-Cと命名)を発行したとする。各SQL文は独立したトランズアクションとする。この時点では、どれもコミットしていない。

★各update文を発行した段階で、サーバープロセスは以下の作業を実行:
@ データベースバッファキャッシュ内にUNDOブロックを確保し、データの対象行をロックする。

A REDOログバッファにupdate-A,B,C各々についての変更前後の情報を記録

B UNDOブロックに変更前の情報を記録、次いで、UNDOブロック内のデータを物理データファイル上にUNDOセグメントとして書き込む。

C データベースバッファキャッシュ上の対象行のデータが変更される。

★ここでupdate-Aに対して、コミットが発行されたとする:
D LGWRプロセスの働きにより、ログバッファ上のupdate-A,B,C全ての変更前後データがREDOログファイルに記録される。1つのグループに入りきらなかったため、ログスイッチが発生。

E ログスイッチの発生により、チェックポイントが発生し、DBWnプロセスの働きにより、データベースバッファキャッシュ上のupdate-A, B, Cに対応する変更データがデータファイルに記録される。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-12-04 13:53
引用:

雪洲さんの書き込み (2005-12-03 20:38) より:
Oracle 9i Silver DBA I を受験しようと勉強中です。学術的な質問で恐縮ですが、どなたか解る方、お助けください。

[質問]
[凡例]をご覧いただいた上で下記質問事項を読んでください。

(1)コミットが発行されたのは、update-A文に対応する変更についてだけなのに、REDOログファイル(D部分)や、データファイルへの書込み(E部分)はupdate-A,B,C全ての変更について発生するというのが私の理解です。この理解で正しいでしょうか?



データファイルやREDOログ(バッファ含む)への書き込みは発生しても、
トランザクションがコミットされない限り確定ではありません。
REDOログファイルへコミットレコードが物理的に書き込まれて、
初めてトランザクションが完了することになります。

コミットされなかった更新は、ロールバックやインスタンスリカバリの時に
REDOログやUNDO表領域の情報を駆使して闇に葬り去られます。

Oracleは、トランザクションは殆どの場合にコミットされる、という仮定に
基づいた最適化方針で設計されているから、というのが答えでしょうか。

この辺り(Oracleの実装に依存しない知識)をもう少し詳しく知りたいのであれば、
トランザクション処理システム入門なんて本がいいかもです。

引用:

(2)私の理解が正しいとした場合、Eでデータファイルに書き込まれたデータベースバッファキャッシュの内、未コミットに対応するupdate-B,Cの内容はロールバックされなければならないと思うのですが、いつロールバックされるのでしょうか?なお、データベースは正常に今後も動作し続け、インスタンス障害等によるインスタンスリカバリは発生しないものとします。



update-B,Cのロールバックは、障害が発生しないのであれば、
そのトランザクションの実行者がロールバックさせた時です。
この凡例には書いていないので、誰も発生させないのでしょう。

おそらく、未コミットな更新でもデータファイルやREDOログへの
書き込みが発生するということを示したかったのではないでしょうか。
雪洲
会議室デビュー日: 2005/12/03
投稿数: 2
投稿日時: 2005-12-04 16:17
あしゅさん、明快なご説明ありがとうございました。
おかげ様ですっきり下記のように理解しました(万一間違っているようでしたら恐縮ですが、再度ご指摘ください)。

「今回の凡例における動作についての記述内容は正しいといえる。しかし現実の世界においては、(Oracleでは)トランザクションは殆どの場合にコミットされるという仮定に基づいた最適化方針で設計されているため、データファイルに未コミット情報が書き込まれるケースはあまりないと思われる。仮にあった場合、インスタンスリカバリ以外で、その情報がデータベース起動中にロールバックされるのは、トランズアクション実行者が明示的にrollbackを発行したときのみである。このロールバックの過程において、コミットされなかった更新は、REDOログやUNDO表領域の情報を駆使してデータファイルから消去され、データベースバッファキャッシュ上に戻される。なお、データベースを停止した後、再起動するタイミングでも、未コミットデータに対するロールバックは発生する。」

追伸:
「トランザクション処理システム入門」のご紹介ありがとうございます。
難しそうな本のようですが、試験が終わったら、ぜひ、一読してみたいと思います。

ありがとうございました!
1

スキルアップ/キャリアアップ(JOB@IT)