トランザクション処理
要点と定義
トランザクションは、データベースに対する処理をひとまとまりとして扱う単位です。同時実行制御で処理間の干渉を抑え、障害回復で確定した更新を反映し未確定の更新を取り消すなどして、データの整合性を保ちます。シラバスでは同時実行制御、障害回復、トランザクション管理とACID特性を扱います。
過去の出題で扱った補足として、SQLシーケンスから取得した値は、トランザクションをロールバックしても戻らない場合があります。値の払い出しと表データの更新は同じように取り消されるとは限らず、欠番が生じ得ます。構文や詳細な動作はDBMSの仕様によります。
ダーティリードは、あるトランザクションがコミットする前の更新値を別のトランザクションが読むことです。更新側が後でロールバックすると、読み取った側は確定しなかった値を参照したことになります。判断では、未コミット値を読んだか、その更新が後に取り消されたかを確かめます。
待ちグラフの矢印 X→Y は、XがYのロック解放を待っていることを表します。循環を構成するトランザクションは互いの解放を待ち続けます。また、循環内のトランザクションを待つ処理も、循環が解消されない限り進めません。
読取りの待ち方や参照する値は、同時実行制御方式によって異なります。単版2相ロッキングでは、競合するロックが解放されるまで読取りが待つ場合があります。MVCCは複数のデータ版を使います。過去の出題で扱った補足として、指定されたREAD COMMITTEDの条件では、MVCCは未コミット値を読まず、待たずに直前の確定値を読みます。実際の挙動は方式、隔離性水準、DBMSの条件を確認して判断します。
過去の出題で扱った補足として、不整合検索異状は、並行実行中に関連するデータを一貫しない状態で扱い、その関係が整合しなくなる現象です。例えば、一方のデータを読んだ値に基づいて関連データを更新した後、別の処理が元のデータを更新すると、関連データが新しい状態を反映しなくなることがあります。
隔離性水準は、並行実行中の読取り異状をどこまで防ぐかを定めます。REPEATABLE READは、同じ行をトランザクション中に再読した際、値が変わる非反復読取りを防ぎます。READ COMMITTEDでは、別の処理が更新をコミットした後に再読すると値が変わり得ます。
障害回復では、チェックポイント後にコミット済みの更新を再適用するロールフォワードと、障害時に未コミットの更新を取り消すロールバックを使い分けます。読み取りだけの処理には取り消す更新がありません。対象を見分けるには、コミットの有無、更新の有無、チェックポイントとの前後関係を確認します。
過去の出題で扱った補足として、REDOのべき等性とは、同じREDOを繰り返しても、正常終了後のデータ状態が一度実行した場合と同じになる性質です。再実行で更新が重複し、結果が変わるかどうかが判断の要点です。
適用条件と例
処理のまとまりを考える例として、口座間の送金では、差し引きと入金を一つのトランザクションに含めます。途中で障害が起きたときに片方だけが確定すると、金額の整合性が崩れるためです。どの処理を一つにまとめるかは、守りたいデータ上の整合性に基づいて決めます。
この節の続き
- 誤りやすい点
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む