トランザクション処理
要点と定義
トランザクション処理では、複数の処理が同時にデータへアクセスしても整合性を保つため、ロックなどで実行を制御する。また、障害後に更新を回復する仕組みと、トランザクションに求められるACID特性を理解する。
共有ロックは参照のためのロックで、共有ロック同士は両立する。専有ロックは更新などのためのロックで、同じデータに対する共有ロックや別の専有ロックとは両立しない。ロック粒度はロック対象の範囲を指し、行単位と表単位では競合する範囲が異なる。対象範囲が重なると、ロックの両立性が問題になる。
デッドロックは、複数のトランザクションが互いに相手のロック解放を待ち、処理を進められなくなる状態である。待ちグラフに閉路があると、その閉路上のトランザクションは互いを待つ。閉路上の処理を待つ別のトランザクションも、待ち続けることがある。
障害回復では、バックアップをリストアした後、バックアップ取得後にコミットした更新をログから再適用する処理をロールフォワードという。未コミットの更新を取り消す処理はロールバックという。チェックポイント後にコミットした更新はロールフォワードの対象となり、障害時に未コミットで書込みを行っていた処理はロールバックの対象となる。
ACID特性の一つである一貫性(Consistency)は、トランザクションの実行後もデータベースの整合性が保たれる性質である。
適用条件と例
同じデータを二つの処理が参照する場合、双方が共有ロックなら並行して進められる。一方に専有ロックが含まれる場合、後続処理は先行処理の終了を待つ。行に対するロックと表に対するロックでは対象範囲が異なるため、別の行へのロックは両立し得るが、表全体を対象とするロックはその表内の行とも競合し得る。
たとえば、処理Aが資源Sを保持したままTを待ち、処理BがTを保持したままSを待つと、相互待ちとなる。待ちグラフで閉路を調べると、閉路上の処理と、その閉路上の処理を待つ処理を特定できる。
チェックポイント後にコミット済みの更新が障害で失われた場合は、その更新を再適用する。障害時に未コミットで書込みを行っていた処理は、その更新を取り消す。読取りだけでデータベースを更新していない未コミット処理には、取り消す更新がない。
誤りやすい点
ロールフォワードとロールバックは、処理の開始時点だけで区別しない。チェックポイント前に開始した処理でも、チェックポイント後にコミットした更新はロールフォワードの対象となる。また、未コミットであっても読取りだけの処理には、ロールバックする更新がない。
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む