トランザクション障害とシステム障害の違い

応用君さん  
(No.1)
例えばシステム障害の問題として、応用情報技術者 平成28年秋期 午前問30などがありますが
そもそもトランザクション障害とシステム障害の違いが分かりません
トランザクション障害というのは一つのトランザクションが終わらないうちに起きる障害、
そのトランザクションは途中で終わってしまったが一部データは書き換えられているし、データが消えたという話ではない。
データの整合性を保つために更新前ログを使ってロールバックする。
システム障害というのは最後のチェックポイントからシステム障害発生の間のデータが失われる状態のこと、という理解でよろしいでしょうか?

ちなみに最後のチェックポイントとシステム障害の間にコミットされたトランザクションの場合これも、ロールフォワード処理で回復するようですね。これはどう理解したらよろしいでしょうか?
例えばその取引をTR4とする場合、TR4の取引開始時に更新前ログ、コミット時に更新後
ログがあって、その2つで回復するのでしょうか?
コミットするとログファイルが書き出されるとテキストにあります。チェックポイントでは
データベースファイルとログファイルが書き出されるとあります。
チェックポイントをまたいでコミットしたトランザクションの場合、チェックポイントのデータベースファイルとコミット時の更新後ログファイルを用いてロールフォワードして復旧すると理解出来るのですが、チェックポイントとチェックポイントの間でコミットしたトランザクションはどのようにして復旧するのでしょうか?
あれですか、コミット時の更新後ログさえあればファイルの復旧は出来てしまえて、別にデータベース本体のデータや更新前ログは無くてもいいのですか?
あと、更新前ログというのはトランザクション開始時、更新後ログというのはコミット時に発生するという解釈でよろしいでしょうか?
2017.12.10 18:06
応用君さん  
(No.2)
>トランザクション障害というのは一つのトランザクションが終わらないうちに起きる障害、
そのトランザクションは途中で終わってしまったが一部データは書き換えられているし、データが消えたという話ではない。

これに付け加えるにチェックポイントをまたいでいないトランザクション。これがチェックポイントをまたいでいればシステム障害扱いになる、ということでいいですか?
2017.12.10 18:28
復習者さん 
(No.3)
>>そもそもトランザクション障害とシステム障害の違いが分かりません
  通信回線の障害や、ハードディスクの故障、アプリケーションやOSの不具合等でシステムになんらかの不具合が出た状態がシステム障害で、
システム障害によって、
  ①トランザクション開始後がコミットする前に中断
  ②コミット後であってもチェックポイント到達前に中断
した状態がトランザクション障害になると思います。
H28秋期午前問30に関して言えば、全体としてシステム障害はありますが、T1はトランザクション障害にはなりません。(T2~T6はトランザクション障害になります。)
  なお、ロールバック、ロールフォワードいずれもその時点である最終(最新)ログファイルまで戻ります。
A.ロールバック
  最終「チェックポイント時」のログファイルまで戻る。(DBファイルの内容は現状のままで変更されない)
B.ロールフォワード
  最終「コミット時」のログファイルまで戻る。(DBファイルの内容をログファイルを使用して更新する)

>>チェックポイントをまたいでコミットしたトランザクションの場合、チェックポイントのデータベースファイルとコミット時の更新後ログファイルを用いてロールフォワードして復旧すると理解出来るのですが、チェックポイントとチェックポイントの間でコミットしたトランザクションはどのようにして復旧するのでしょうか?
  いずれの場合でもDBファイルに書き込まれているデータは、「最終のチェックポイント時点」の内容です。コミット時のログファイルには「最終チェックポイント時以降コミット時」までの処理手順が記載されているので、最終チェックポイント時の「データ」とコミット時の「ログファイル」から復旧が可能です。

>>コミット時の更新後ログさえあればファイルの復旧は出来てしまえて、別にデータベース本体のデータや更新前ログは無くてもいいのですか?
  上記のとおり、ロールフォワードの場合は、「現データ」と「ログファイル」を使用してDBファイルを更新するので、ログファイルだけでは復旧できません。
2017.12.10 21:40
復習者さん 
(No.4)
補足・修正いたします。
>>いずれの場合でもDBファイルに書き込まれているデータは、「最終のチェックポイント時点」の内容です。
いずれの場合でも「障害発生時に」DBファイルに書き込まれているデータは、「最終のチェックポイント時点」の内容です。
2017.12.11 05:45
応用君さん  
(No.5)
すいません、今大きな間違いに気づいたのですが、TR4というのはテキストのTR4を
そのまま使ってしまったので、問題30とは直接関係ありません。誤解させてしまったら
すいません。
チェックポイントの後でトランザクションが始まり、次のチェックポイントの
前でコミットせずにシステム障害が発生したケースを言っています。だから障害が起きた時点では
次のチェックポイントは存在していません。問題文だとT6と同じです。おなじですが
厳密にはトランザクション障害ではないようです。
テキストでは「これはシステム障害が発生した時点でコミットされていないため、
データベース・バッファの内容が消失しても問題ありません(再処理で対応」)とあります。
これは解答と説明が違うんですが(解答では更新前ログまで戻す)、それはさておきテキストではやはりシステム障害とトランザクション障害は別にみているようです。
テキストでは、データXとデータYを更新しなければならないトランザクションで
Xが更新されたがYは更新されないまま異常終了したケースをトランザクション障害としています。
トランザクションの中にはチェックポイントを通らなくてもデータベースの一部が書き換えられてしまうような異常なケースがあるということではないでしょうか?テキストには「アプリケーションプログラムのバグやデッドロックを解除するための強制終了などでアプリケーションが異常終了した場合・・・」
と説明があります。


A.ロールバック
  最終「チェックポイント時」のログファイルまで戻る。(DBファイルの内容は現状のままで変更されない)
B.ロールフォワード
  最終「コミット時」のログファイルまで戻る。(DBファイルの内容をログファイルを使用して更新する)

Aについてですが、T6のようにチェックポイントにひっかかってない場合は、更新前ログ
だけでロールバック出来るのですよね?
あとT6の場合、これも更新前ログと更新後ログを使ってロールフォワード
出来るのですよね?最終のチェックポイントのデータベースデータと更新後ログを
使わないといけないのでしょうか?

まとめるとロールフォワードはデータベースデータと更新後ログが無いと出来ない(データベースのデータは最終のチェックポイントから入手したもの)
ロールバックは更新前ログだけで出来るトランザクション障害は強制終了などアプリが異常終了したケースで、データの一部が書き換わってしまう場合、ということでよろしいですか?

テキストあるならそれでやれ、という意見もあると思いますが、こうやって試行錯誤してる内に
見えてくることがございますので、、間違ってるかもしれませんが
2017.12.13 03:01
復習者さん 
(No.6)
>チェックポイントの後でトランザクションが始まり、次のチェックポイントの前でコミットせずにシステム障害が発生したケースを言っています。だから障害が起きた時点では次のチェックポイントは存在していません。問題文だとT6と同じです。おなじですが厳密にはトランザクション障害ではないようです。(中略)それはさておきテキストではやはりシステム障害とトランザクション障害は別にみているようです。
レスNo3において「システム障害」、「トランザクション障害」とも私の記憶・理解の内容で解答させていただきました。用語の意味としてはそれで間違いないと思いますが、もしかすると特にDB分野においてもっと厳密な(狭義の)定義があるのかもしれません。その部分は私には解かりかねますので、どなたかフォローいただければ幸いです。中途半端な知識で解答してしまい申し訳ありません。
>テキストでは「これはシステム障害が発生した時点でコミットされていないため、データベース・バッファの内容が消失しても問題ありません(再処理で対応」)とあります。これは解答と説明が違うんですが(解答では更新前ログまで戻す)
ロールバックは「コミット前に中断されたトランザクション」をなかったことにするので、結果的に更新前ログの内容に戻ることになります。上記についても中途のトランザクションを破棄(ロールバック)の後、再処理で対応という意味だと思われます。
>テキストでは、データXとデータYを更新しなければならないトランザクションでXが更新されたがYは更新されないまま異常終了したケースをトランザクション障害としています。トランザクションの中にはチェックポイントを通らなくてもデータベースの一部が書き換えられてしまうような異常なケースがあるということではないでしょうか?テキストには「アプリケーションプログラムのバグやデッドロックを解除するための強制終了などでアプリケーションが異常終了した場合・・・」と説明があります。
これについては全く想定しておりませんでした。バグはともかく、デッドロック解除のための強制終了があったとしても本来あってはならないことです。応用君さんのテキストではこれをトランザクション障害と定義しているのですね。ただ、これが発生するとなると、データX更新(書き込み)時に「更新後ログ」が作成されているとは思えないので通常のロールバックでは対処できず、バックアップデータをリストアした後にロールフォワードすることで対応するしかないと思います。
2017.12.13 07:39
復習者さん 
(No.7)
長くなりましたので分割しました。
>T6のようにチェックポイントにひっかかってない場合は、更新前ログだけでロールバック出来るのですよね?
更新前ログだけでロールバックは可能です。実際にはトランザクションを破棄するだけですのでなにもしなくてもよい気もするのですが、その辺のアプリの細かい動きは分かりません。
>T6の場合、これも更新前ログと更新後ログを使ってロールフォワード出来るのですよね?最終のチェックポイントのデータベースデータと更新後ログを使わないといけないのでしょうか?
おそらくT5についての内容だと思われますが、これについてはレスNo3での私の解答が間違っておりました。更新前ログ(ロールバックセグメント)には更新前のデータも含まれているので、更新前ログと更新後ログだけでロールフォワードは可能なようです。

URLの貼り付けができませんので、
データベース研究室 – DATABASE LABO
で検索をかけてみてください。出てきたページの
トランザクション障害
の項目が参考になると思います。
2017.12.13 07:47
応用君さん  
(No.8)
詳しい解説、親切にありがとうございます
ちなみに、T4でwriteになる場合はどのような処理になるんでしょうか?
テキストでは、チェックポイントからT4の開始時点まで戻るような記述なんですか
いまいち判然としません。障害発生地点からチェックポント、チェックポイントから
開始時点に2度ロールバックするようにも思えるのですが

こんな記述があります。(T4は書き換えてます)

T4は、システム再立ち上げ後に、更新前ログを用いたロールバック処理で、トランザクション
開始時点の内容に戻します
システム再立ち上げの際、チェックポイントまで戻り、更新ログを使用したロールバックや
ロールフォワード、また再処理を行ってシステムを再始動する方式をウォームスタート方式
という。

T6は障害発生時点からトランザクション開始時点まで更新前ログを使ってロールバックしてますね。
ですからT4も障害発生地点からチェックポイントまでロールバックし、さらに開始時点まで
ロールバックするのでしょうか?チェックポイントから障害発生地点もなんらかのデータが書き込まれてしまうかもしれないので?
もし私の予想が正しいなら、チェックポイントの更新前ログにロールバックして(
チェックポイントには更新後ログと更新前ログがあるという仮定)、更新前ログにロールバックするのでしょうか?
2017.12.16 05:12
復習者さん 
(No.9)
T4はwriteが含まれていれば、トランザクション開始時にまでロールバックします。(下記の③と同様)
writeが含まれるトランザクションに関して基本的には下記のとおりとなります。
①チェックポイント前にコミットしていれば何も行わない(T1)
②チェックポイント後、障害発生時の間でコミットしていればロールフォワード(T2,T5)
③障害発生時にコミットしてなければロールバック(T6)

>>T4は、システム再立ち上げ後に、更新前ログを用いたロールバック処理で、トランザクション開始時点の内容に戻します。システム再立ち上げの際、チェックポイントまで戻り、更新ログを使用したロールバックやロールフォワード、また再処理を行ってシステムを再始動する方式をウォームスタート方式という。
実際のテキストを見ていないのであくまで推測ですが、上記の文章は
「T4は、システム再立ち上げ後に、更新前ログを用いたロールバック処理で、トランザクション開始時点の内容に戻します。」でいったん終了していて、次の「システム再立ち上げの際、チェックポイントまで戻り、更新ログを使用したロールバックやロールフォワード、また再処理を行ってシステムを再始動する方式をウォームスタート方式という。」単にウォームスタートを解説しているのではないでしょうか?
2017.12.16 20:56
復習者さん 
(No.10)
顔アイコンが別物になっておりました。
失礼しました。
2017.12.16 20:59
応用君さん  
(No.11)
ごめんなさい。T6がトランザクション開始時点までロールバックするのは理解してるのですが、
●トランザクション開始時点←チェックポイント←システム障害時

T4のようにシステム障害時からロールバックするのか

●トランザクション開始時点←チェックポイント

のようにいきなりチェックポイントからロールバックするのか、が分からないということです

●トランザクション開始時点←システム障害時
なんか気付いたんでですが、このパターンはいかにもシステム障害時からトランザクション開始時点に戻る、という風に見えるんですが、使う情報はトランザクション開始時点の更新前ログ
だけですよね?システム障害時の状況はなにか変わってるのもしれないが
トランザクション開始時に書き換えれば良いのだからどうなっているかは見ない

だから
●トランザクション開始時点←チェックポイント←システム障害時
これも時の流れ上は、システム障害時から、トランザクション開始時点に戻りますが
使う情報はトランザクション開始時の更新前ログのみ、ということでよろしいですか?
チェックポイントですでにデータベースに書き込まれているからその記録が消えるという
意味でチェックポイントからトランザクション開始時に戻るイメージではありますが。
2017.12.17 10:01
復習者さん 
(No.12)
データベーススペシャリストドットコム 平成25年春期 午前Ⅱ 問16の解説にチェックポイントでの処理として次の内容が書かれておりました。
①実行中のトランザクションを一時停止する
②メモリバッファの内容をディスクに書き出す
>>チェックポイント通過中の全てのトランザクションのログを吐き出すという意味だと思われます。
③チェックポイントレコードを書き出す
>>直前でコミットしたトランザクションのデータをディスクに書き出すという意味だと思われます。
④中断したトランザクションを再開する

ここで「更新前ログ(チェックポイントで作成されるログ)」について考えてみると、T6に関してはチェックポイント時にトランザクションが開始されていないため、ログにはなにも残っていないものと思われ、T4に関してはトランザクションの途中経過が残っていると思われます。

このことから、
T6は
①システム障害
②更新前ログで該当トランザクションがないことを確認
③無処理(結果的にT6を破棄)

T4(含write)は
①システム障害
②更新前ログで中途のトランザクションがあることを確認
③該当トランザクションの更新後ログがないことを確認
④  ②③からT4がコミットしていないことを確認
⑤T4を破棄
といった流れになると思われます。
2017.12.17 14:25

返信投稿用フォーム

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

その他のスレッド


Pagetop