トランザクション処理
要点と定義
トランザクションは、データベースに対する一連の処理をまとめて扱う単位です。ACID特性の一つである一貫性は、整合性を満たす状態からトランザクションを実行した後も、定められた整合性が保たれる性質です。同時実行時に処理同士の干渉を制御する独立性とは区別します。
同じデータへのアクセスを制御する代表的な方法がロックです。共有ロック同士なら読み取りを並行して行えますが、排他ロックが関わる組合せでは競合し、後続処理が待つことがあります。ロックの粒度や方式など、実際の動作は採用する制御方式によります。
デッドロックは、複数の処理が互いの保持するロックを待ち、待ち状態が循環した状態です。一つの処理がロックを待っているだけでは、待ちの循環が成立したとは限りません。
障害回復では、バックアップを戻すこと、ログから確定済み更新を再適用するロールフォワード、未完了の変更を取り消すロールバックを区別します。バックアップ取得後にコミットした更新は、回復目標時点までログを適用して反映します。障害時に未コミットで書き込みを行った処理は、未確定の変更を残さないよう取り消します。
チェックポイントは、障害回復でログを確認する際の目安になります。チェックポイント後にコミットした更新は再適用の対象です。未コミットでも読み取りだけの処理には、取り消す書き込みがありません。チェックポイント前にコミット済みの処理も、チェックポイント後の更新として再適用する対象には含めません。
媒体障害でデータベースの記憶内容が失われた場合は、バックアップから復元してログを適用し、回復目標時点まで戻します。ログが不足している場合、そのログに記録されていない更新を回復できるとは限りません。
適用条件と例
例えば、予約登録と空席数の更新を一つのトランザクションにまとめる場合、処理が完了したときに両方の状態が整合している必要があります。一貫性を保つには、守るべき条件を処理や制約に反映しておくことが前提です。トランザクションという単位にまとめただけで、どのような処理でも自動的に整合性が保たれるわけではありません。
在庫表と出荷表を二つの処理が使うとします。処理甲が在庫表をロックしたまま出荷表を待ち、処理乙が出荷表をロックしたまま在庫表を待つと、互いのロック解放を待つ循環になります。一方、甲が乙のロックを待っていても、乙が甲のロックを待っていなければ、デッドロックとは判定できません。
バックアップとログを組み合わせる運用では、バックアップ時点より後に確定した更新をログから再適用し、データを回復します。フルバックアップの間隔が長くなると、一定の更新頻度を前提にした場合、回復時に反映するログが増えて処理時間が延びる傾向があります。一回分のフルバックアップの対象データ量は、取得間隔だけでは決まりません。
誤りやすい点
ロールフォワードは確定済みの更新を回復データに反映する操作、ロールバックは未完了の変更を取り消す操作です。バックアップ取得後にコミットした更新を反映する問題では、未完了処理のロールバックだけを答えにしてはいけません。
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む